##// END OF EJS Templates
Made some fields in post admin read-only. Show attachment as its url
neko259 -
r1389:c9a1cd47 default
parent child Browse files
Show More
@@ -1,74 +1,75 b''
1 from django.contrib import admin
1 from django.contrib import admin
2 from boards.models import Post, Tag, Ban, Thread, Banner
2 from boards.models import Post, Tag, Ban, Thread, Banner
3 from django.utils.translation import ugettext_lazy as _
3 from django.utils.translation import ugettext_lazy as _
4
4
5
5
6 @admin.register(Post)
6 @admin.register(Post)
7 class PostAdmin(admin.ModelAdmin):
7 class PostAdmin(admin.ModelAdmin):
8
8
9 list_display = ('id', 'title', 'text', 'poster_ip')
9 list_display = ('id', 'title', 'text', 'poster_ip')
10 list_filter = ('pub_time',)
10 list_filter = ('pub_time',)
11 search_fields = ('id', 'title', 'text', 'poster_ip')
11 search_fields = ('id', 'title', 'text', 'poster_ip')
12 exclude = ('referenced_posts', 'refmap')
12 exclude = ('referenced_posts', 'refmap')
13 readonly_fields = ('poster_ip', 'threads', 'thread', 'images', 'uid')
13 readonly_fields = ('poster_ip', 'threads', 'thread', 'images',
14 'attachments', 'uid', 'url', 'pub_time', 'opening')
14
15
15 def ban_poster(self, request, queryset):
16 def ban_poster(self, request, queryset):
16 bans = 0
17 bans = 0
17 for post in queryset:
18 for post in queryset:
18 poster_ip = post.poster_ip
19 poster_ip = post.poster_ip
19 ban, created = Ban.objects.get_or_create(ip=poster_ip)
20 ban, created = Ban.objects.get_or_create(ip=poster_ip)
20 if created:
21 if created:
21 bans += 1
22 bans += 1
22 self.message_user(request, _('{} posters were banned').format(bans))
23 self.message_user(request, _('{} posters were banned').format(bans))
23
24
24 actions = ['ban_poster']
25 actions = ['ban_poster']
25
26
26
27
27 @admin.register(Tag)
28 @admin.register(Tag)
28 class TagAdmin(admin.ModelAdmin):
29 class TagAdmin(admin.ModelAdmin):
29
30
30 def thread_count(self, obj: Tag) -> int:
31 def thread_count(self, obj: Tag) -> int:
31 return obj.get_thread_count()
32 return obj.get_thread_count()
32
33
33 def display_children(self, obj: Tag):
34 def display_children(self, obj: Tag):
34 return ', '.join([str(child) for child in obj.get_children().all()])
35 return ', '.join([str(child) for child in obj.get_children().all()])
35
36
36 list_display = ('name', 'thread_count', 'display_children')
37 list_display = ('name', 'thread_count', 'display_children')
37 search_fields = ('name',)
38 search_fields = ('name',)
38
39
39
40
40 @admin.register(Thread)
41 @admin.register(Thread)
41 class ThreadAdmin(admin.ModelAdmin):
42 class ThreadAdmin(admin.ModelAdmin):
42
43
43 def title(self, obj: Thread) -> str:
44 def title(self, obj: Thread) -> str:
44 return obj.get_opening_post().get_title()
45 return obj.get_opening_post().get_title()
45
46
46 def reply_count(self, obj: Thread) -> int:
47 def reply_count(self, obj: Thread) -> int:
47 return obj.get_reply_count()
48 return obj.get_reply_count()
48
49
49 def ip(self, obj: Thread):
50 def ip(self, obj: Thread):
50 return obj.get_opening_post().poster_ip
51 return obj.get_opening_post().poster_ip
51
52
52 def display_tags(self, obj: Thread):
53 def display_tags(self, obj: Thread):
53 return ', '.join([str(tag) for tag in obj.get_tags().all()])
54 return ', '.join([str(tag) for tag in obj.get_tags().all()])
54
55
55 def op(self, obj: Thread):
56 def op(self, obj: Thread):
56 return obj.get_opening_post_id()
57 return obj.get_opening_post_id()
57
58
58 list_display = ('id', 'op', 'title', 'reply_count', 'archived', 'ip',
59 list_display = ('id', 'op', 'title', 'reply_count', 'archived', 'ip',
59 'display_tags')
60 'display_tags')
60 list_filter = ('bump_time', 'archived', 'bumpable')
61 list_filter = ('bump_time', 'archived', 'bumpable')
61 search_fields = ('id', 'title')
62 search_fields = ('id', 'title')
62 filter_horizontal = ('tags',)
63 filter_horizontal = ('tags',)
63
64
64
65
65 @admin.register(Ban)
66 @admin.register(Ban)
66 class BanAdmin(admin.ModelAdmin):
67 class BanAdmin(admin.ModelAdmin):
67 list_display = ('ip', 'can_read')
68 list_display = ('ip', 'can_read')
68 list_filter = ('can_read',)
69 list_filter = ('can_read',)
69 search_fields = ('ip',)
70 search_fields = ('ip',)
70
71
71
72
72 @admin.register(Banner)
73 @admin.register(Banner)
73 class BannerAdmin(admin.ModelAdmin):
74 class BannerAdmin(admin.ModelAdmin):
74 list_display = ('title', 'text')
75 list_display = ('title', 'text')
@@ -1,41 +1,42 b''
1 from django.db import models
1 from django.db import models
2
2
3 from boards import utils
3 from boards import utils
4 from boards.models.attachment.viewers import get_viewers, AbstractViewer
4 from boards.models.attachment.viewers import get_viewers, AbstractViewer
5 from boards.utils import get_upload_filename, get_file_mimetype, get_extension
5 from boards.utils import get_upload_filename, get_file_mimetype, get_extension
6
6
7
7
8 class AttachmentManager(models.Manager):
8 class AttachmentManager(models.Manager):
9 def create_with_hash(self, file):
9 def create_with_hash(self, file):
10 file_hash = utils.get_file_hash(file)
10 file_hash = utils.get_file_hash(file)
11 existing = self.filter(hash=file_hash)
11 existing = self.filter(hash=file_hash)
12 if len(existing) > 0:
12 if len(existing) > 0:
13 attachment = existing[0]
13 attachment = existing[0]
14 else:
14 else:
15 # FIXME Use full mimetype here, need to modify viewers too
15 # FIXME Use full mimetype here, need to modify viewers too
16 file_type = get_extension(file.name)
16 file_type = get_extension(file.name)
17 attachment = self.create(file=file, mimetype=file_type,
17 attachment = self.create(file=file, mimetype=file_type,
18 hash=file_hash)
18 hash=file_hash)
19
19
20 return attachment
20 return attachment
21
21
22
22
23 class Attachment(models.Model):
23 class Attachment(models.Model):
24 objects = AttachmentManager()
24 objects = AttachmentManager()
25
25
26 file = models.FileField(upload_to=get_upload_filename)
26 file = models.FileField(upload_to=get_upload_filename)
27 mimetype = models.CharField(max_length=50)
27 mimetype = models.CharField(max_length=50)
28 hash = models.CharField(max_length=36)
28 hash = models.CharField(max_length=36)
29
29
30 def get_view(self):
30 def get_view(self):
31 file_viewer = None
31 file_viewer = None
32 for viewer in get_viewers():
32 for viewer in get_viewers():
33 if viewer.supports(self.mimetype):
33 if viewer.supports(self.mimetype):
34 file_viewer = viewer
34 file_viewer = viewer
35 break
35 break
36 if file_viewer is None:
36 if file_viewer is None:
37 file_viewer = AbstractViewer
37 file_viewer = AbstractViewer
38
38
39 return file_viewer(self.file, self.mimetype).get_view()
39 return file_viewer(self.file, self.mimetype).get_view()
40
40
41
41 def __str__(self):
42 return self.file.url
General Comments 0
You need to be logged in to leave comments. Login now