0001_initial.py 18 KB

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