0001_initial.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import django.db.models.deletion
  4. import django.utils.timezone
  5. from django.conf import settings
  6. from django.contrib.postgres.fields import JSONField
  7. from django.contrib.postgres.search import SearchVectorField
  8. from django.db import migrations, models
  9. import misago.threads.models.attachment
  10. from misago.core.pgutils import CreatePartialCompositeIndex, CreatePartialIndex
  11. class Migration(migrations.Migration):
  12. dependencies = [
  13. ('misago_categories', '0001_initial'),
  14. migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  15. ]
  16. operations = [
  17. migrations.CreateModel(
  18. name='Post',
  19. fields=[
  20. ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
  21. ('poster_name', models.CharField(max_length=255)),
  22. ('poster_ip', models.GenericIPAddressField()),
  23. ('original', models.TextField()),
  24. ('parsed', models.TextField()),
  25. ('checksum', models.CharField(max_length=64, default='-')),
  26. ('attachments_cache', JSONField(null=True, blank=True)),
  27. ('posted_on', models.DateTimeField()),
  28. ('updated_on', models.DateTimeField()),
  29. ('edits', models.PositiveIntegerField(default=0)),
  30. ('last_editor_name', models.CharField(max_length=255, null=True, blank=True)),
  31. ('last_editor_slug', models.SlugField(max_length=255, null=True, blank=True)),
  32. ('hidden_by', models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True)),
  33. ('hidden_by_name', models.CharField(max_length=255, null=True, blank=True)),
  34. ('hidden_by_slug', models.SlugField(max_length=255, null=True, blank=True)),
  35. ('hidden_on', models.DateTimeField(default=django.utils.timezone.now)),
  36. ('has_reports', models.BooleanField(default=False)),
  37. ('has_open_reports', models.BooleanField(default=False)),
  38. ('is_unapproved', models.BooleanField(default=False, db_index=True)),
  39. ('is_hidden', models.BooleanField(default=False)),
  40. ('is_protected', models.BooleanField(default=False)),
  41. ('category', models.ForeignKey(to='misago_categories.Category')),
  42. ('last_editor', models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True)),
  43. ('mentions', models.ManyToManyField(related_name='mention_set', to=settings.AUTH_USER_MODEL)),
  44. ('poster', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True)),
  45. ('is_event', models.BooleanField(default=False, db_index=True)),
  46. ('event_type', models.CharField(max_length=255, null=True, blank=True)),
  47. ('event_context', JSONField(null=True, blank=True)),
  48. ('likes', models.PositiveIntegerField(default=0)),
  49. ('last_likes', JSONField(blank=True, null=True)),
  50. ('search_document', models.TextField(blank=True, null=True)),
  51. ('search_vector', SearchVectorField()),
  52. ],
  53. options={
  54. },
  55. bases=(models.Model,),
  56. ),
  57. CreatePartialIndex(
  58. field='Post.has_open_reports',
  59. index_name='misago_post_has_open_reports_partial',
  60. condition='has_open_reports = TRUE',
  61. ),
  62. CreatePartialIndex(
  63. field='Post.is_hidden',
  64. index_name='misago_post_is_hidden_partial',
  65. condition='is_hidden = FALSE',
  66. ),
  67. migrations.CreateModel(
  68. name='Thread',
  69. fields=[
  70. ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
  71. ('title', models.CharField(max_length=255)),
  72. ('slug', models.CharField(max_length=255)),
  73. ('replies', models.PositiveIntegerField(default=0, db_index=True)),
  74. ('has_events', models.BooleanField(default=False)),
  75. ('has_poll', models.BooleanField(default=False)),
  76. ('has_reported_posts', models.BooleanField(default=False)),
  77. ('has_open_reports', models.BooleanField(default=False)),
  78. ('has_unapproved_posts', models.BooleanField(default=False)),
  79. ('has_hidden_posts', models.BooleanField(default=False)),
  80. ('started_on', models.DateTimeField(db_index=True)),
  81. ('starter_name', models.CharField(max_length=255)),
  82. ('starter_slug', models.CharField(max_length=255)),
  83. ('last_post_is_event', models.BooleanField(default=False)),
  84. ('last_post_on', models.DateTimeField(db_index=True)),
  85. ('last_poster_name', models.CharField(max_length=255, null=True, blank=True)),
  86. ('last_poster_slug', models.CharField(max_length=255, null=True, blank=True)),
  87. ('weight', models.PositiveIntegerField(default=0)),
  88. ('is_unapproved', models.BooleanField(default=False, db_index=True)),
  89. ('is_hidden', models.BooleanField(default=False)),
  90. ('is_closed', models.BooleanField(default=False)),
  91. ],
  92. options={
  93. },
  94. bases=(models.Model,),
  95. ),
  96. CreatePartialIndex(
  97. field='Thread.weight',
  98. index_name='misago_thread_is_global',
  99. condition='weight = 2',
  100. ),
  101. CreatePartialIndex(
  102. field='Thread.weight',
  103. index_name='misago_thread_is_local',
  104. condition='weight < 2',
  105. ),
  106. migrations.CreateModel(
  107. name='ThreadParticipant',
  108. fields=[
  109. ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
  110. ('thread', models.ForeignKey(to='misago_threads.Thread')),
  111. ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
  112. ('is_owner', models.BooleanField(default=False)),
  113. ],
  114. options={
  115. },
  116. bases=(models.Model,),
  117. ),
  118. migrations.AddField(
  119. model_name='thread',
  120. name='participants',
  121. field=models.ManyToManyField(related_name='private_thread_set', through='misago_threads.ThreadParticipant', through_fields=('thread', 'user'), to=settings.AUTH_USER_MODEL),
  122. preserve_default=True,
  123. ),
  124. CreatePartialIndex(
  125. field='Thread.has_reported_posts',
  126. index_name='misago_thread_has_reported_posts_partial',
  127. condition='has_reported_posts = TRUE',
  128. ),
  129. CreatePartialIndex(
  130. field='Thread.has_unapproved_posts',
  131. index_name='misago_thread_has_unapproved_posts_partial',
  132. condition='has_unapproved_posts = TRUE',
  133. ),
  134. CreatePartialIndex(
  135. field='Thread.is_hidden',
  136. index_name='misago_thread_is_hidden_partial',
  137. condition='is_hidden = FALSE',
  138. ),
  139. CreatePartialIndex(
  140. field='Thread.weight',
  141. index_name='misago_thread_is_pinned_globally_partial',
  142. condition='weight = 2',
  143. ),
  144. CreatePartialIndex(
  145. field='Thread.weight',
  146. index_name='misago_thread_is_pinned_locally_partial',
  147. condition='weight = 1',
  148. ),
  149. CreatePartialIndex(
  150. field='Thread.weight',
  151. index_name='misago_thread_is_unpinned_partial',
  152. condition='weight = 0',
  153. ),
  154. migrations.AddField(
  155. model_name='post',
  156. name='thread',
  157. field=models.ForeignKey(to='misago_threads.Thread'),
  158. preserve_default=True,
  159. ),
  160. migrations.AddField(
  161. model_name='thread',
  162. name='first_post',
  163. field=models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='misago_threads.Post', null=True),
  164. preserve_default=True,
  165. ),
  166. migrations.AddField(
  167. model_name='thread',
  168. name='category',
  169. field=models.ForeignKey(to='misago_categories.Category'),
  170. preserve_default=True,
  171. ),
  172. migrations.AddField(
  173. model_name='thread',
  174. name='last_post',
  175. field=models.ForeignKey(related_name='+', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='misago_threads.Post', null=True),
  176. preserve_default=True,
  177. ),
  178. migrations.AddField(
  179. model_name='thread',
  180. name='last_poster',
  181. field=models.ForeignKey(related_name='last_poster_set', on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True),
  182. preserve_default=True,
  183. ),
  184. migrations.AddField(
  185. model_name='thread',
  186. name='starter',
  187. field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True),
  188. preserve_default=True,
  189. ),
  190. migrations.AlterIndexTogether(
  191. name='thread',
  192. index_together=set([
  193. ('category', 'id'),
  194. ('category', 'last_post_on'),
  195. ('category', 'replies'),
  196. ]),
  197. ),
  198. migrations.AlterIndexTogether(
  199. name='post',
  200. index_together=set([
  201. ('thread', 'id'),
  202. ('is_event', 'is_hidden'),
  203. ('poster', 'posted_on'),
  204. ]),
  205. ),
  206. migrations.CreateModel(
  207. name='Subscription',
  208. fields=[
  209. ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
  210. ('last_read_on', models.DateTimeField(default=django.utils.timezone.now)),
  211. ('send_email', models.BooleanField(default=False)),
  212. ('category', models.ForeignKey(to='misago_categories.Category')),
  213. ('thread', models.ForeignKey(to='misago_threads.Thread')),
  214. ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
  215. ],
  216. options={
  217. },
  218. bases=(models.Model,),
  219. ),
  220. migrations.AlterIndexTogether(
  221. name='subscription',
  222. index_together=set([
  223. ('send_email', 'last_read_on'),
  224. ]),
  225. ),
  226. migrations.CreateModel(
  227. name='PostEdit',
  228. fields=[
  229. ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  230. ('edited_on', models.DateTimeField(default=django.utils.timezone.now)),
  231. ('editor_name', models.CharField(max_length=255)),
  232. ('editor_slug', models.CharField(max_length=255)),
  233. ('editor_ip', models.GenericIPAddressField()),
  234. ('edited_from', models.TextField()),
  235. ('edited_to', models.TextField()),
  236. ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_categories.Category')),
  237. ('editor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
  238. ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='edits_record', to='misago_threads.Post')),
  239. ('thread', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread')),
  240. ],
  241. options={
  242. 'ordering': ['-id'],
  243. },
  244. ),
  245. migrations.CreateModel(
  246. name='Attachment',
  247. fields=[
  248. ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  249. ('secret', models.CharField(max_length=64)),
  250. ('uploaded_on', models.DateTimeField(default=django.utils.timezone.now, db_index=True)),
  251. ('uploader_name', models.CharField(max_length=255)),
  252. ('uploader_slug', models.CharField(max_length=255, db_index=True)),
  253. ('uploader_ip', models.GenericIPAddressField()),
  254. ('filename', models.CharField(max_length=255, db_index=True)),
  255. ('size', models.PositiveIntegerField(default=0, db_index=True)),
  256. ('thumbnail', models.ImageField(blank=True, null=True, upload_to=misago.threads.models.attachment.upload_to)),
  257. ('image', models.ImageField(blank=True, null=True, upload_to=misago.threads.models.attachment.upload_to)),
  258. ('file', models.FileField(blank=True, null=True, upload_to=misago.threads.models.attachment.upload_to)),
  259. ('post', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='misago_threads.Post')),
  260. ],
  261. ),
  262. migrations.CreateModel(
  263. name='AttachmentType',
  264. fields=[
  265. ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  266. ('name', models.CharField(max_length=255)),
  267. ('extensions', models.CharField(max_length=255)),
  268. ('mimetypes', models.CharField(blank=True, max_length=255, null=True)),
  269. ('size_limit', models.PositiveIntegerField(default=1024)),
  270. ('status', models.PositiveIntegerField(choices=[(0, 'Allow uploads and downloads'), (1, 'Allow downloads only'), (2, 'Disallow both uploading and downloading')], default=0)),
  271. ('limit_downloads_to', models.ManyToManyField(blank=True, related_name='_attachmenttype_limit_downloads_to_+', to='misago_acl.Role')),
  272. ('limit_uploads_to', models.ManyToManyField(blank=True, related_name='_attachmenttype_limit_uploads_to_+', to='misago_acl.Role')),
  273. ],
  274. ),
  275. migrations.AddField(
  276. model_name='attachment',
  277. name='filetype',
  278. field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.AttachmentType'),
  279. ),
  280. migrations.AddField(
  281. model_name='attachment',
  282. name='uploader',
  283. field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
  284. ),
  285. migrations.CreateModel(
  286. name='Poll',
  287. fields=[
  288. ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  289. ('poster_name', models.CharField(max_length=255)),
  290. ('poster_slug', models.CharField(max_length=255)),
  291. ('poster_ip', models.GenericIPAddressField()),
  292. ('posted_on', models.DateTimeField(default=django.utils.timezone.now)),
  293. ('length', models.PositiveIntegerField(default=0)),
  294. ('question', models.CharField(max_length=255)),
  295. ('choices', django.contrib.postgres.fields.jsonb.JSONField()),
  296. ('allowed_choices', models.PositiveIntegerField(default=1)),
  297. ('allow_revotes', models.BooleanField(default=False)),
  298. ('votes', models.PositiveIntegerField(default=0)),
  299. ('is_public', models.BooleanField(default=False)),
  300. ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_categories.Category')),
  301. ('poster', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
  302. ('thread', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread')),
  303. ],
  304. ),
  305. migrations.CreateModel(
  306. name='PollVote',
  307. fields=[
  308. ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  309. ('voter_name', models.CharField(max_length=255)),
  310. ('voter_slug', models.CharField(max_length=255)),
  311. ('voter_ip', models.GenericIPAddressField()),
  312. ('voted_on', models.DateTimeField(default=django.utils.timezone.now)),
  313. ('choice_hash', models.CharField(db_index=True, max_length=12)),
  314. ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_categories.Category')),
  315. ('poll', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Poll')),
  316. ('thread', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread')),
  317. ('voter', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
  318. ],
  319. ),
  320. migrations.AlterIndexTogether(
  321. name='pollvote',
  322. index_together=set([
  323. ('poll', 'voter_name'),
  324. ]),
  325. ),
  326. migrations.CreateModel(
  327. name='PostLike',
  328. fields=[
  329. ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  330. ('liker_name', models.CharField(max_length=255, db_index=True)),
  331. ('liker_slug', models.CharField(max_length=255)),
  332. ('liker_ip', models.GenericIPAddressField()),
  333. ('liked_on', models.DateTimeField(default=django.utils.timezone.now)),
  334. ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_categories.Category')),
  335. ],
  336. options={
  337. 'ordering': ['-id'],
  338. },
  339. ),
  340. migrations.AddField(
  341. model_name='postlike',
  342. name='post',
  343. field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Post'),
  344. ),
  345. migrations.AddField(
  346. model_name='postlike',
  347. name='thread',
  348. field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'),
  349. ),
  350. migrations.AddField(
  351. model_name='postlike',
  352. name='liker',
  353. field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
  354. ),
  355. migrations.AddField(
  356. model_name='post',
  357. name='liked_by',
  358. field=models.ManyToManyField(related_name='liked_post_set', through='misago_threads.PostLike', to=settings.AUTH_USER_MODEL),
  359. ),
  360. ]