##// END OF EJS Templates
If there is no post update time, use pub time
If there is no post update time, use pub time

File last commit:

r1986:0b41439a default
r2098:c4ac6a57 default
Show More
admin.py
193 lines | 6.2 KiB | text/x-python | PythonLexer
neko259
Adapt to django-2.0
r1986 from django.contrib import admin
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from boards.models import Post, Tag, Ban, Thread, Banner, Attachment, \
KeyPair, GlobalId, TagAlias, STATUS_ACTIVE
neko259
Added sticker pack functionality
r1951 from boards.models.attachment import FILE_TYPES_IMAGE, AttachmentSticker, \
StickerPack
neko259
Added fetch sources to fetch external information into threads as posts
r1968 from boards.models.source import ThreadSource
neko259
Initial commit. One test doesn't work, missing posting form.
r0
neko259
Moved some settings to boards.settings
r333
neko259
Cleaned up admin site. Update thread's tags list when it is saved
r906 @admin.register(Post)
neko259
Added a better admin interface.
r305 class PostAdmin(admin.ModelAdmin):
neko259
In admin site, show if the post is foreign
r1583 list_display = ('id', 'title', 'text', 'poster_ip', 'linked_images',
neko259
Added tags list to post admin. Post's tags are its thread's tags for now
r1620 'foreign', 'tags')
neko259
Don't list all threads to filter posts by
r969 list_filter = ('pub_time',)
neko259
Allow searching posts by IP in the admin site
r1130 search_fields = ('id', 'title', 'text', 'poster_ip')
neko259
Show global id as a link in admin site
r1559 exclude = ('referenced_posts', 'refmap', 'images', 'global_id')
neko259
Removed multitread posts 'feature'
r1704 readonly_fields = ('poster_ip', 'thread', 'linked_images',
neko259
Added version to post content
r1569 'attachments', 'uid', 'url', 'pub_time', 'opening', 'linked_global_id',
neko259
Use update-time of a post instead of version
r1928 'foreign', 'tags')
neko259
Added a better admin interface.
r305
neko259
Added admin action to ban user that posted given messages
r968 def ban_poster(self, request, queryset):
bans = 0
for post in queryset:
poster_ip = post.poster_ip
ban, created = Ban.objects.get_or_create(ip=poster_ip)
if created:
bans += 1
self.message_user(request, _('{} posters were banned').format(bans))
neko259
Admin action to ban user with all his posts
r1608 def ban_latter_with_delete(self, request, queryset):
neko259
Allow banning user and hiding all its (by IP) posts
r1495 bans = 0
hidden = 0
for post in queryset:
poster_ip = post.poster_ip
ban, created = Ban.objects.get_or_create(ip=poster_ip)
if created:
bans += 1
neko259
Hide only posts later than the specified ones when banning a user
r1496 posts = Post.objects.filter(poster_ip=poster_ip, id__gte=post.id)
neko259
Allow banning user and hiding all its (by IP) posts
r1495 hidden += posts.count()
neko259
Admin action to ban user with all his posts
r1608 posts.delete()
self.message_user(request, _('{} posters were banned, {} messages were removed.').format(bans, hidden))
neko259
Translate ban admin action
r1609 ban_latter_with_delete.short_description = _('Ban user and delete posts starting from this one and later')
neko259
Allow banning user and hiding all its (by IP) posts
r1495
neko259
Added image aliases to upload the same images (like "fake" or "gtfo")
r1500 def linked_images(self, obj: Post):
neko259
Store images as regular attachments instead of separate model
r1590 images = obj.attachments.filter(mimetype__in=FILE_TYPES_IMAGE)
neko259
Show image previews in post's admin page
r1541 image_urls = ['<a href="{}"><img src="{}" /></a>'.format(
reverse('admin:%s_%s_change' % (image._meta.app_label,
image._meta.model_name),
neko259
Fixed post admin
r1606 args=[image.id]), image.get_thumb_url()) for image in images]
neko259
Added image aliases to upload the same images (like "fake" or "gtfo")
r1500 return ', '.join(image_urls)
linked_images.allow_tags = True
neko259
Show global id as a link in admin site
r1559 def linked_global_id(self, obj: Post):
global_id = obj.global_id
if global_id is not None:
return '<a href="{}">{}</a>'.format(
reverse('admin:%s_%s_change' % (global_id._meta.app_label,
global_id._meta.model_name),
args=[global_id.id]), str(global_id))
linked_global_id.allow_tags = True
neko259
Allow banning user and hiding all its (by IP) posts
r1495
neko259
Added tags list to post admin. Post's tags are its thread's tags for now
r1620 def tags(self, obj: Post):
neko259
Fixed post admin
r1885 return ', '.join([tag.get_name() for tag in obj.get_tags()])
neko259
Added tags list to post admin. Post's tags are its thread's tags for now
r1620
neko259
Added version to post content
r1569 def save_model(self, request, obj, form, change):
obj.save()
obj.clear_cache()
neko259
In admin site, show if the post is foreign
r1583 def foreign(self, obj: Post):
return obj is not None and obj.global_id is not None and\
not obj.global_id.is_local()
neko259
Admin action to ban user with all his posts
r1608 actions = ['ban_poster', 'ban_latter_with_delete']
neko259
Added admin action to ban user that posted given messages
r968
neko259
Moved some settings to boards.settings
r333
neko259
Cleaned up admin site. Update thread's tags list when it is saved
r906 @admin.register(Tag)
neko259
Added a better admin interface.
r305 class TagAdmin(admin.ModelAdmin):
neko259
Small admin changes
r910 def thread_count(self, obj: Tag) -> int:
return obj.get_thread_count()
neko259
More columns for tag and thread admin
r1356 def display_children(self, obj: Tag):
return ', '.join([str(child) for child in obj.get_children().all()])
neko259
Tag name is now stored in the alias with default locale
r1874 def name(self, obj: Tag):
return obj.get_name()
neko259
Update tag threads' tags when the tag's parent is changed
r1471 def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)
for thread in obj.get_threads().all():
thread.refresh_tags()
neko259
Simplified tag alias admin
r1886
neko259
More columns for tag and thread admin
r1356 list_display = ('name', 'thread_count', 'display_children')
neko259
Search tags by id
r1887 search_fields = ('id',)
neko259
Tag name is now stored in the alias with default locale
r1874 readonly_fields = ('name',)
neko259
Added a better admin interface.
r305
neko259
Cosmetic changes to the admin models
r883
neko259
Fixed thread creation
r1862 @admin.register(TagAlias)
class TagAliasAdmin(admin.ModelAdmin):
list_display = ('locale', 'name', 'parent')
neko259
Simplified tag alias admin
r1886 list_filter = ('locale',)
search_fields = ('name',)
neko259
Fixed thread creation
r1862
neko259
Cleaned up admin site. Update thread's tags list when it is saved
r906 @admin.register(Thread)
neko259
Added thread admin interface
r604 class ThreadAdmin(admin.ModelAdmin):
neko259
Small admin changes
r910 def title(self, obj: Thread) -> str:
neko259
Cosmetic changes to the admin models
r883 return obj.get_opening_post().get_title()
neko259
Added thread admin interface
r604
neko259
Small admin changes
r910 def reply_count(self, obj: Thread) -> int:
neko259
Added thread admin interface
r604 return obj.get_reply_count()
neko259
Small admin changes
r910 def ip(self, obj: Thread):
neko259
Cleaned up admin site. Update thread's tags list when it is saved
r906 return obj.get_opening_post().poster_ip
neko259
More columns for tag and thread admin
r1356 def display_tags(self, obj: Thread):
return ', '.join([str(tag) for tag in obj.get_tags().all()])
def op(self, obj: Thread):
return obj.get_opening_post_id()
neko259
When editing tags in admin, add their parents as in a thread creation form
r1470 # Save parent tags when editing tags
def save_related(self, request, form, formsets, change):
super().save_related(request, form, formsets, change)
neko259
Update tag threads' tags when the tag's parent is changed
r1471 form.instance.refresh_tags()
neko259
Added version to post content
r1569
def save_model(self, request, obj, form, change):
op = obj.get_opening_post()
obj.save()
op.clear_cache()
neko259
Thread status field instead of bumpable and archived fields (per BB-73)
r1414 list_display = ('id', 'op', 'title', 'reply_count', 'status', 'ip',
neko259
More columns for tag and thread admin
r1356 'display_tags')
neko259
Thread status field instead of bumpable and archived fields (per BB-73)
r1414 list_filter = ('bump_time', 'status')
neko259
Added thread admin interface
r604 search_fields = ('id', 'title')
neko259
Better interface for the thread admin tags list
r921 filter_horizontal = ('tags',)
neko259
Added thread admin interface
r604
neko259
Cosmetic changes to the admin models
r883
neko259
Merged with default branch
r933 @admin.register(KeyPair)
neko259
Added an admin page for keypair. Renamed the public key to global id in the...
r797 class KeyPairAdmin(admin.ModelAdmin):
list_display = ('public_key', 'primary')
list_filter = ('primary',)
search_fields = ('public_key',)
neko259
Merged with default branch
r933
neko259
Cleaned up admin site. Update thread's tags list when it is saved
r906 @admin.register(Ban)
neko259
Updated ban admin to search by ip
r804 class BanAdmin(admin.ModelAdmin):
list_display = ('ip', 'can_read')
list_filter = ('can_read',)
neko259
Better interface for the thread admin tags list
r921 search_fields = ('ip',)
neko259
Added banner to show the site news. Returned the message middleware because it...
r1148
@admin.register(Banner)
class BannerAdmin(admin.ModelAdmin):
list_display = ('title', 'text')
neko259
Added image aliases to upload the same images (like "fake" or "gtfo")
r1500
neko259
Store images as regular attachments instead of separate model
r1590 @admin.register(Attachment)
class AttachmentAdmin(admin.ModelAdmin):
neko259
Added sticker as a separate entity for the attachment aliases
r1937 list_display = ('__str__', 'mimetype', 'file', 'url')
neko259
Download attached filed to the post during sync
r1511
neko259
Added sticker as a separate entity for the attachment aliases
r1937 @admin.register(AttachmentSticker)
class AttachmentStickerAdmin(admin.ModelAdmin):
search_fields = ('name',)
neko259
Allow deleting aliases
r1750
neko259
Download attached filed to the post during sync
r1511
neko259
Added sticker pack functionality
r1951 @admin.register(StickerPack)
class StickerPackAdmin(admin.ModelAdmin):
search_fields = ('name',)
neko259
Download attached filed to the post during sync
r1511 @admin.register(GlobalId)
class GlobalIdAdmin(admin.ModelAdmin):
def is_linked(self, obj):
return Post.objects.filter(global_id=obj).exists()
neko259
Don't allow editing global id content via admin site
r1550 list_display = ('__str__', 'is_linked',)
neko259
Show global id as a link in admin site
r1559 readonly_fields = ('content',)
neko259
Added fetch sources to fetch external information into threads as posts
r1968
@admin.register(ThreadSource)
class ThreadSourceAdmin(admin.ModelAdmin):
search_fields = ('name', 'source')
neko259
Allow choosing only active threads source admin
r1971 def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'thread':
kwargs['queryset'] = Thread.objects.filter(status=STATUS_ACTIVE)
return super().formfield_for_foreignkey(db_field, request, **kwargs)