##// END OF EJS Templates
Added 'bumpable' field. Disable thread bump once and for all, not counting it...
neko259 -
r863:0dc734ff default
parent child Browse files
Show More
@@ -0,0 +1,74 b''
1 # -*- coding: utf-8 -*-
2 from south.utils import datetime_utils as datetime
3 from south.db import db
4 from south.v2 import SchemaMigration
5 from django.db import models
6
7
8 class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Adding field 'Thread.bumpable'
12 db.add_column('boards_thread', 'bumpable',
13 self.gf('django.db.models.fields.BooleanField')(default=True),
14 keep_default=False)
15
16
17 def backwards(self, orm):
18 # Deleting field 'Thread.bumpable'
19 db.delete_column('boards_thread', 'bumpable')
20
21
22 models = {
23 'boards.ban': {
24 'Meta': {'object_name': 'Ban'},
25 'can_read': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
26 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
27 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
28 'reason': ('django.db.models.fields.CharField', [], {'max_length': '200', 'default': "'Auto'"})
29 },
30 'boards.post': {
31 'Meta': {'object_name': 'Post', 'ordering': "('id',)"},
32 '_text_rendered': ('django.db.models.fields.TextField', [], {}),
33 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
34 'images': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'null': 'True', 'db_index': 'True', 'blank': 'True', 'related_name': "'ip+'", 'to': "orm['boards.PostImage']"}),
35 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}),
36 'poster_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
37 'poster_user_agent': ('django.db.models.fields.TextField', [], {}),
38 'pub_time': ('django.db.models.fields.DateTimeField', [], {}),
39 'referenced_posts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'null': 'True', 'db_index': 'True', 'blank': 'True', 'related_name': "'rfp+'", 'to': "orm['boards.Post']"}),
40 'refmap': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
41 'text': ('markupfield.fields.MarkupField', [], {'rendered_field': 'True'}),
42 'text_markup_type': ('django.db.models.fields.CharField', [], {'max_length': '30', 'default': "'bbcode'"}),
43 'thread_new': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'null': 'True', 'to': "orm['boards.Thread']"}),
44 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'})
45 },
46 'boards.postimage': {
47 'Meta': {'object_name': 'PostImage', 'ordering': "('id',)"},
48 'hash': ('django.db.models.fields.CharField', [], {'max_length': '36'}),
49 'height': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
50 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
51 'image': ('boards.thumbs.ImageWithThumbsField', [], {'max_length': '100', 'blank': 'True'}),
52 'pre_height': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
53 'pre_width': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
54 'width': ('django.db.models.fields.IntegerField', [], {'default': '0'})
55 },
56 'boards.tag': {
57 'Meta': {'object_name': 'Tag', 'ordering': "('name',)"},
58 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59 'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '100'}),
60 'threads': ('django.db.models.fields.related.ManyToManyField', [], {'null': 'True', 'symmetrical': 'False', 'blank': 'True', 'related_name': "'tag+'", 'to': "orm['boards.Thread']"})
61 },
62 'boards.thread': {
63 'Meta': {'object_name': 'Thread'},
64 'archived': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
65 'bump_time': ('django.db.models.fields.DateTimeField', [], {}),
66 'bumpable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
67 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
68 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}),
69 'replies': ('django.db.models.fields.related.ManyToManyField', [], {'null': 'True', 'symmetrical': 'False', 'blank': 'True', 'related_name': "'tre+'", 'to': "orm['boards.Post']"}),
70 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['boards.Tag']"})
71 }
72 }
73
74 complete_apps = ['boards']
@@ -0,0 +1,81 b''
1 # -*- coding: utf-8 -*-
2 from south.utils import datetime_utils as datetime
3 from south.db import db
4 from south.v2 import DataMigration
5 from django.db import models
6 import boards
7
8 class Migration(DataMigration):
9
10 def forwards(self, orm):
11 changed_count = 0
12
13 for thread in orm['boards.Thread'].objects.all():
14 if thread.replies.count() >= boards.settings.MAX_POSTS_PER_THREAD:
15 thread.bumpable = False
16 print('Disabled bump on thread {}'.format(thread.id))
17 changed_count += 1
18 else:
19 thread.bumpable = True
20 thread.save(update_fields=['bumpable'])
21
22
23 print('Changed {} threads.'.format(changed_count))
24
25 def backwards(self, orm):
26 "Write your backwards methods here."
27
28 models = {
29 'boards.ban': {
30 'Meta': {'object_name': 'Ban'},
31 'can_read': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
32 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
33 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
34 'reason': ('django.db.models.fields.CharField', [], {'default': "'Auto'", 'max_length': '200'})
35 },
36 'boards.post': {
37 'Meta': {'object_name': 'Post', 'ordering': "('id',)"},
38 '_text_rendered': ('django.db.models.fields.TextField', [], {}),
39 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
40 'images': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'ip+'", 'null': 'True', 'to': "orm['boards.PostImage']", 'db_index': 'True', 'blank': 'True'}),
41 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}),
42 'poster_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
43 'poster_user_agent': ('django.db.models.fields.TextField', [], {}),
44 'pub_time': ('django.db.models.fields.DateTimeField', [], {}),
45 'referenced_posts': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'rfp+'", 'null': 'True', 'to': "orm['boards.Post']", 'db_index': 'True', 'blank': 'True'}),
46 'refmap': ('django.db.models.fields.TextField', [], {'blank': 'True', 'null': 'True'}),
47 'text': ('markupfield.fields.MarkupField', [], {'rendered_field': 'True'}),
48 'text_markup_type': ('django.db.models.fields.CharField', [], {'default': "'bbcode'", 'max_length': '30'}),
49 'thread_new': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['boards.Thread']", 'null': 'True'}),
50 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'})
51 },
52 'boards.postimage': {
53 'Meta': {'object_name': 'PostImage', 'ordering': "('id',)"},
54 'hash': ('django.db.models.fields.CharField', [], {'max_length': '36'}),
55 'height': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
56 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
57 'image': ('boards.thumbs.ImageWithThumbsField', [], {'blank': 'True', 'max_length': '100'}),
58 'pre_height': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
59 'pre_width': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
60 'width': ('django.db.models.fields.IntegerField', [], {'default': '0'})
61 },
62 'boards.tag': {
63 'Meta': {'object_name': 'Tag', 'ordering': "('name',)"},
64 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
65 'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '100'}),
66 'threads': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'null': 'True', 'to': "orm['boards.Thread']", 'related_name': "'tag+'", 'blank': 'True'})
67 },
68 'boards.thread': {
69 'Meta': {'object_name': 'Thread'},
70 'archived': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
71 'bump_time': ('django.db.models.fields.DateTimeField', [], {}),
72 'bumpable': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
73 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
74 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}),
75 'replies': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'null': 'True', 'to': "orm['boards.Post']", 'related_name': "'tre+'", 'blank': 'True'}),
76 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['boards.Tag']"})
77 }
78 }
79
80 complete_apps = ['boards']
81 symmetrical = True
@@ -73,7 +73,10 b' class PostManager(models.Manager):'
73 else:
73 else:
74 thread.bump()
74 thread.bump()
75 thread.last_edit_time = posting_time
75 thread.last_edit_time = posting_time
76 thread.save()
76 if thread.can_bump() and (
77 thread.get_reply_count() >= settings.MAX_POSTS_PER_THREAD):
78 thread.bumpable = False
79 thread.save(update_fields=['last_edit_time', 'bumpable'])
77 new_thread = False
80 new_thread = False
78
81
79 post = self.create(title=title,
82 post = self.create(title=title,
@@ -101,6 +104,7 b' class PostManager(models.Manager):'
101 Thread.objects.process_oldest_threads()
104 Thread.objects.process_oldest_threads()
102 self.connect_replies(post)
105 self.connect_replies(post)
103
106
107
104 return post
108 return post
105
109
106 def delete_post(self, post):
110 def delete_post(self, post):
@@ -414,4 +418,4 b' class Post(models.Model, Viewable):'
414 post_id = reply_number.group(1)
418 post_id = reply_number.group(1)
415 ref_post = Post.objects.filter(id=post_id)[0]
419 ref_post = Post.objects.filter(id=post_id)[0]
416
420
417 ref_post.send_to_websocket(request, recursive=False) No newline at end of file
421 ref_post.send_to_websocket(request, recursive=False)
@@ -38,8 +38,9 b' class ThreadManager(models.Manager):'
38
38
39 def _archive_thread(self, thread):
39 def _archive_thread(self, thread):
40 thread.archived = True
40 thread.archived = True
41 thread.bumpable = False
41 thread.last_edit_time = timezone.now()
42 thread.last_edit_time = timezone.now()
42 thread.save(update_fields=['archived', 'last_edit_time'])
43 thread.save(update_fields=['archived', 'last_edit_time', 'bumpable'])
43
44
44
45
45 class Thread(models.Model):
46 class Thread(models.Model):
@@ -54,6 +55,7 b' class Thread(models.Model):'
54 replies = models.ManyToManyField('Post', symmetrical=False, null=True,
55 replies = models.ManyToManyField('Post', symmetrical=False, null=True,
55 blank=True, related_name='tre+')
56 blank=True, related_name='tre+')
56 archived = models.BooleanField(default=False)
57 archived = models.BooleanField(default=False)
58 bumpable = models.BooleanField(default=True)
57
59
58 def get_tags(self):
60 def get_tags(self):
59 """
61 """
@@ -88,12 +90,7 b' class Thread(models.Model):'
88 Checks if the thread can be bumped by replying to it.
90 Checks if the thread can be bumped by replying to it.
89 """
91 """
90
92
91 if self.archived:
93 return self.bumpable
92 return False
93
94 post_count = self.get_reply_count()
95
96 return post_count < settings.MAX_POSTS_PER_THREAD
97
94
98 def get_last_replies(self):
95 def get_last_replies(self):
99 """
96 """
@@ -185,4 +182,4 b' class Thread(models.Model):'
185 if self.replies.exists():
182 if self.replies.exists():
186 self.replies.all().delete()
183 self.replies.all().delete()
187
184
188 super(Thread, self).delete(using) No newline at end of file
185 super(Thread, self).delete(using)
@@ -50,7 +50,8 b' function connectWebsocket() {'
50 });
50 });
51
51
52 centrifuge.on('error', function(error_message) {
52 centrifuge.on('error', function(error_message) {
53 alert("Error connecting to websocket server.");
53 console.log("Error connecting to websocket server.");
54 return false;
54 });
55 });
55
56
56 centrifuge.on('connect', function() {
57 centrifuge.on('connect', function() {
@@ -68,6 +69,8 b' function connectWebsocket() {'
68 });
69 });
69
70
70 centrifuge.connect();
71 centrifuge.connect();
72
73 return true;
71 }
74 }
72
75
73 function updatePost(postHtml, isAdded) {
76 function updatePost(postHtml, isAdded) {
@@ -260,8 +263,7 b' function processNewPost(post) {'
260
263
261 $(document).ready(function(){
264 $(document).ready(function(){
262 if ('WebSocket' in window) {
265 if ('WebSocket' in window) {
263 initAutoupdate();
266 if (initAutoupdate()) {
264
265 // Post form data over AJAX
267 // Post form data over AJAX
266 var threadId = $('div.thread').children('.post').first().attr('id');
268 var threadId = $('div.thread').children('.post').first().attr('id');
267
269
@@ -279,4 +281,5 b' function processNewPost(post) {'
279
281
280 resetForm(form);
282 resetForm(form);
281 }
283 }
284 }
282 });
285 });
General Comments 0
You need to be logged in to leave comments. Login now