0001_initial.py 18 KB

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