0001_initial.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  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 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. (
  21. 'id', models.AutoField(
  22. verbose_name='ID', serialize=False, auto_created=True, primary_key=True
  23. )
  24. ),
  25. ('poster_name', models.CharField(max_length=255)),
  26. ('poster_ip', models.GenericIPAddressField()),
  27. ('original', models.TextField()),
  28. ('parsed', models.TextField()),
  29. ('checksum', models.CharField(max_length=64, default='-')),
  30. ('attachments_cache', JSONField(null=True, blank=True)),
  31. ('posted_on', models.DateTimeField()),
  32. ('updated_on', models.DateTimeField()),
  33. ('edits', models.PositiveIntegerField(default=0)),
  34. ('last_editor_name', models.CharField(max_length=255, null=True, blank=True)),
  35. ('last_editor_slug', models.SlugField(max_length=255, null=True, blank=True)),
  36. (
  37. 'hidden_by', models.ForeignKey(
  38. related_name='+',
  39. on_delete=django.db.models.deletion.SET_NULL,
  40. blank=True,
  41. to=settings.AUTH_USER_MODEL,
  42. null=True
  43. )
  44. ),
  45. ('hidden_by_name', models.CharField(max_length=255, null=True, blank=True)),
  46. ('hidden_by_slug', models.SlugField(max_length=255, null=True, blank=True)),
  47. ('hidden_on', models.DateTimeField(default=django.utils.timezone.now)),
  48. ('has_reports', models.BooleanField(default=False)),
  49. ('has_open_reports', models.BooleanField(default=False)),
  50. ('is_unapproved', models.BooleanField(default=False, db_index=True)),
  51. ('is_hidden', models.BooleanField(default=False)),
  52. ('is_protected', models.BooleanField(default=False)),
  53. ('category', models.ForeignKey(to='misago_categories.Category')),
  54. (
  55. 'last_editor', models.ForeignKey(
  56. related_name='+',
  57. on_delete=django.db.models.deletion.SET_NULL,
  58. blank=True,
  59. to=settings.AUTH_USER_MODEL,
  60. null=True
  61. )
  62. ),
  63. (
  64. 'mentions', models.ManyToManyField(
  65. related_name='mention_set', to=settings.AUTH_USER_MODEL
  66. )
  67. ),
  68. (
  69. 'poster', models.ForeignKey(
  70. on_delete=django.db.models.deletion.SET_NULL,
  71. blank=True,
  72. to=settings.AUTH_USER_MODEL,
  73. null=True
  74. )
  75. ),
  76. ('is_event', models.BooleanField(default=False, db_index=True)),
  77. ('event_type', models.CharField(max_length=255, null=True, blank=True)),
  78. ('event_context', JSONField(null=True, blank=True)),
  79. ('likes', models.PositiveIntegerField(default=0)),
  80. ('last_likes', JSONField(blank=True, null=True)),
  81. ('search_document', models.TextField(blank=True, null=True)),
  82. ('search_vector', SearchVectorField()),
  83. ],
  84. options={},
  85. bases=(models.Model, ),
  86. ),
  87. CreatePartialIndex(
  88. field='Post.has_open_reports',
  89. index_name='misago_post_has_open_reports_partial',
  90. condition='has_open_reports = TRUE',
  91. ),
  92. CreatePartialIndex(
  93. field='Post.is_hidden',
  94. index_name='misago_post_is_hidden_partial',
  95. condition='is_hidden = FALSE',
  96. ),
  97. migrations.CreateModel(
  98. name='Thread',
  99. fields=[
  100. (
  101. 'id', models.AutoField(
  102. verbose_name='ID', serialize=False, auto_created=True, primary_key=True
  103. )
  104. ),
  105. ('title', models.CharField(max_length=255)),
  106. ('slug', models.CharField(max_length=255)),
  107. ('replies', models.PositiveIntegerField(default=0, db_index=True)),
  108. ('has_events', models.BooleanField(default=False)),
  109. ('has_poll', models.BooleanField(default=False)),
  110. ('has_reported_posts', models.BooleanField(default=False)),
  111. ('has_open_reports', models.BooleanField(default=False)),
  112. ('has_unapproved_posts', models.BooleanField(default=False)),
  113. ('has_hidden_posts', models.BooleanField(default=False)),
  114. ('started_on', models.DateTimeField(db_index=True)),
  115. ('starter_name', models.CharField(max_length=255)),
  116. ('starter_slug', models.CharField(max_length=255)),
  117. ('last_post_is_event', models.BooleanField(default=False)),
  118. ('last_post_on', models.DateTimeField(db_index=True)),
  119. ('last_poster_name', models.CharField(max_length=255, null=True, blank=True)),
  120. ('last_poster_slug', models.CharField(max_length=255, null=True, blank=True)),
  121. ('weight', models.PositiveIntegerField(default=0)),
  122. ('is_unapproved', models.BooleanField(default=False, db_index=True)),
  123. ('is_hidden', models.BooleanField(default=False)),
  124. ('is_closed', models.BooleanField(default=False)),
  125. ],
  126. options={},
  127. bases=(models.Model, ),
  128. ),
  129. CreatePartialIndex(
  130. field='Thread.weight',
  131. index_name='misago_thread_is_global',
  132. condition='weight = 2',
  133. ),
  134. CreatePartialIndex(
  135. field='Thread.weight',
  136. index_name='misago_thread_is_local',
  137. condition='weight < 2',
  138. ),
  139. migrations.CreateModel(
  140. name='ThreadParticipant',
  141. fields=[
  142. (
  143. 'id', models.AutoField(
  144. verbose_name='ID', serialize=False, auto_created=True, primary_key=True
  145. )
  146. ),
  147. ('thread', models.ForeignKey(to='misago_threads.Thread')),
  148. ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
  149. ('is_owner', models.BooleanField(default=False)),
  150. ],
  151. options={},
  152. bases=(models.Model, ),
  153. ),
  154. migrations.AddField(
  155. model_name='thread',
  156. name='participants',
  157. field=models.ManyToManyField(
  158. related_name='privatethread_set',
  159. through='misago_threads.ThreadParticipant',
  160. to=settings.AUTH_USER_MODEL
  161. ),
  162. preserve_default=True,
  163. ),
  164. CreatePartialIndex(
  165. field='Thread.has_reported_posts',
  166. index_name='misago_thread_has_reported_posts_partial',
  167. condition='has_reported_posts = TRUE',
  168. ),
  169. CreatePartialIndex(
  170. field='Thread.has_unapproved_posts',
  171. index_name='misago_thread_has_unapproved_posts_partial',
  172. condition='has_unapproved_posts = TRUE',
  173. ),
  174. CreatePartialIndex(
  175. field='Thread.is_hidden',
  176. index_name='misago_thread_is_hidden_partial',
  177. condition='is_hidden = FALSE',
  178. ),
  179. CreatePartialIndex(
  180. field='Thread.weight',
  181. index_name='misago_thread_is_pinned_globally_partial',
  182. condition='weight = 2',
  183. ),
  184. CreatePartialIndex(
  185. field='Thread.weight',
  186. index_name='misago_thread_is_pinned_locally_partial',
  187. condition='weight = 1',
  188. ),
  189. CreatePartialIndex(
  190. field='Thread.weight',
  191. index_name='misago_thread_is_unpinned_partial',
  192. condition='weight = 0',
  193. ),
  194. migrations.AddField(
  195. model_name='post',
  196. name='thread',
  197. field=models.ForeignKey(to='misago_threads.Thread'),
  198. preserve_default=True,
  199. ),
  200. migrations.AddField(
  201. model_name='thread',
  202. name='first_post',
  203. field=models.ForeignKey(
  204. related_name='+',
  205. on_delete=django.db.models.deletion.SET_NULL,
  206. blank=True,
  207. to='misago_threads.Post',
  208. null=True
  209. ),
  210. preserve_default=True,
  211. ),
  212. migrations.AddField(
  213. model_name='thread',
  214. name='category',
  215. field=models.ForeignKey(to='misago_categories.Category'),
  216. preserve_default=True,
  217. ),
  218. migrations.AddField(
  219. model_name='thread',
  220. name='last_post',
  221. field=models.ForeignKey(
  222. related_name='+',
  223. on_delete=django.db.models.deletion.SET_NULL,
  224. blank=True,
  225. to='misago_threads.Post',
  226. null=True
  227. ),
  228. preserve_default=True,
  229. ),
  230. migrations.AddField(
  231. model_name='thread',
  232. name='last_poster',
  233. field=models.ForeignKey(
  234. related_name='last_poster_set',
  235. on_delete=django.db.models.deletion.SET_NULL,
  236. blank=True,
  237. to=settings.AUTH_USER_MODEL,
  238. null=True
  239. ),
  240. preserve_default=True,
  241. ),
  242. migrations.AddField(
  243. model_name='thread',
  244. name='starter',
  245. field=models.ForeignKey(
  246. on_delete=django.db.models.deletion.SET_NULL,
  247. blank=True,
  248. to=settings.AUTH_USER_MODEL,
  249. null=True
  250. ),
  251. preserve_default=True,
  252. ),
  253. migrations.AlterIndexTogether(
  254. name='thread',
  255. index_together=set([
  256. ('category', 'id'),
  257. ('category', 'last_post_on'),
  258. ('category', 'replies'),
  259. ]),
  260. ),
  261. migrations.AlterIndexTogether(
  262. name='post',
  263. index_together=set([
  264. ('thread', 'id'),
  265. ('is_event', 'is_hidden'),
  266. ('poster', 'posted_on'),
  267. ]),
  268. ),
  269. migrations.CreateModel(
  270. name='Subscription',
  271. fields=[
  272. (
  273. 'id', models.AutoField(
  274. verbose_name='ID', serialize=False, auto_created=True, primary_key=True
  275. )
  276. ),
  277. ('last_read_on', models.DateTimeField(default=django.utils.timezone.now)),
  278. ('send_email', models.BooleanField(default=False)),
  279. ('category', models.ForeignKey(to='misago_categories.Category')),
  280. ('thread', models.ForeignKey(to='misago_threads.Thread')),
  281. ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
  282. ],
  283. options={},
  284. bases=(models.Model, ),
  285. ),
  286. migrations.AlterIndexTogether(
  287. name='subscription',
  288. index_together=set([
  289. ('send_email', 'last_read_on'),
  290. ]),
  291. ),
  292. migrations.CreateModel(
  293. name='PostEdit',
  294. fields=[
  295. (
  296. 'id', models.AutoField(
  297. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  298. )
  299. ),
  300. ('edited_on', models.DateTimeField(default=django.utils.timezone.now)),
  301. ('editor_name', models.CharField(max_length=255)),
  302. ('editor_slug', models.CharField(max_length=255)),
  303. ('editor_ip', models.GenericIPAddressField()),
  304. ('edited_from', models.TextField()),
  305. ('edited_to', models.TextField()),
  306. (
  307. 'category', models.ForeignKey(
  308. on_delete=django.db.models.deletion.CASCADE,
  309. to='misago_categories.Category'
  310. )
  311. ),
  312. (
  313. 'editor', models.ForeignKey(
  314. blank=True,
  315. null=True,
  316. on_delete=django.db.models.deletion.SET_NULL,
  317. to=settings.AUTH_USER_MODEL
  318. )
  319. ),
  320. (
  321. 'post', models.ForeignKey(
  322. on_delete=django.db.models.deletion.CASCADE,
  323. related_name='edits_record',
  324. to='misago_threads.Post'
  325. )
  326. ),
  327. (
  328. 'thread', models.ForeignKey(
  329. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'
  330. )
  331. ),
  332. ],
  333. options={
  334. 'ordering': ['-id'],
  335. },
  336. ),
  337. migrations.CreateModel(
  338. name='Attachment',
  339. fields=[
  340. (
  341. 'id', models.AutoField(
  342. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  343. )
  344. ),
  345. ('secret', models.CharField(max_length=64)),
  346. (
  347. 'uploaded_on',
  348. models.DateTimeField(default=django.utils.timezone.now, db_index=True)
  349. ),
  350. ('uploader_name', models.CharField(max_length=255)),
  351. ('uploader_slug', models.CharField(max_length=255, db_index=True)),
  352. ('uploader_ip', models.GenericIPAddressField()),
  353. ('filename', models.CharField(max_length=255, db_index=True)),
  354. ('size', models.PositiveIntegerField(default=0, db_index=True)),
  355. (
  356. 'thumbnail', models.ImageField(
  357. max_length=255,
  358. blank=True,
  359. null=True,
  360. upload_to=misago.threads.models.attachment.upload_to
  361. )
  362. ),
  363. (
  364. 'image', models.ImageField(
  365. max_length=255,
  366. blank=True,
  367. null=True,
  368. upload_to=misago.threads.models.attachment.upload_to
  369. )
  370. ),
  371. (
  372. 'file', models.FileField(
  373. max_length=255,
  374. blank=True,
  375. null=True,
  376. upload_to=misago.threads.models.attachment.upload_to
  377. )
  378. ),
  379. (
  380. 'post', models.ForeignKey(
  381. blank=True,
  382. null=True,
  383. on_delete=django.db.models.deletion.SET_NULL,
  384. to='misago_threads.Post'
  385. )
  386. ),
  387. ],
  388. ),
  389. migrations.CreateModel(
  390. name='AttachmentType',
  391. fields=[
  392. (
  393. 'id', models.AutoField(
  394. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  395. )
  396. ),
  397. ('name', models.CharField(max_length=255)),
  398. ('extensions', models.CharField(max_length=255)),
  399. ('mimetypes', models.CharField(blank=True, max_length=255, null=True)),
  400. ('size_limit', models.PositiveIntegerField(default=1024)),
  401. (
  402. 'status', models.PositiveIntegerField(
  403. choices=[(0, 'Allow uploads and downloads'), (1, 'Allow downloads only'),
  404. (2, 'Disallow both uploading and downloading')],
  405. default=0
  406. )
  407. ),
  408. (
  409. 'limit_downloads_to', models.ManyToManyField(
  410. blank=True,
  411. related_name='_attachmenttype_limit_downloads_to_+',
  412. to='misago_acl.Role'
  413. )
  414. ),
  415. (
  416. 'limit_uploads_to', models.ManyToManyField(
  417. blank=True,
  418. related_name='_attachmenttype_limit_uploads_to_+',
  419. to='misago_acl.Role'
  420. )
  421. ),
  422. ],
  423. ),
  424. migrations.AddField(
  425. model_name='attachment',
  426. name='filetype',
  427. field=models.ForeignKey(
  428. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.AttachmentType'
  429. ),
  430. ),
  431. migrations.AddField(
  432. model_name='attachment',
  433. name='uploader',
  434. field=models.ForeignKey(
  435. blank=True,
  436. null=True,
  437. on_delete=django.db.models.deletion.SET_NULL,
  438. to=settings.AUTH_USER_MODEL
  439. ),
  440. ),
  441. migrations.CreateModel(
  442. name='Poll',
  443. fields=[
  444. (
  445. 'id', models.AutoField(
  446. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  447. )
  448. ),
  449. ('poster_name', models.CharField(max_length=255)),
  450. ('poster_slug', models.CharField(max_length=255)),
  451. ('poster_ip', models.GenericIPAddressField()),
  452. ('posted_on', models.DateTimeField(default=django.utils.timezone.now)),
  453. ('length', models.PositiveIntegerField(default=0)),
  454. ('question', models.CharField(max_length=255)),
  455. ('choices', django.contrib.postgres.fields.jsonb.JSONField()),
  456. ('allowed_choices', models.PositiveIntegerField(default=1)),
  457. ('allow_revotes', models.BooleanField(default=False)),
  458. ('votes', models.PositiveIntegerField(default=0)),
  459. ('is_public', models.BooleanField(default=False)),
  460. (
  461. 'category', models.ForeignKey(
  462. on_delete=django.db.models.deletion.CASCADE,
  463. to='misago_categories.Category'
  464. )
  465. ),
  466. (
  467. 'poster', models.ForeignKey(
  468. blank=True,
  469. null=True,
  470. on_delete=django.db.models.deletion.SET_NULL,
  471. to=settings.AUTH_USER_MODEL
  472. )
  473. ),
  474. (
  475. 'thread', models.OneToOneField(
  476. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'
  477. )
  478. ),
  479. ],
  480. ),
  481. migrations.CreateModel(
  482. name='PollVote',
  483. fields=[
  484. (
  485. 'id', models.AutoField(
  486. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  487. )
  488. ),
  489. ('voter_name', models.CharField(max_length=255)),
  490. ('voter_slug', models.CharField(max_length=255)),
  491. ('voter_ip', models.GenericIPAddressField()),
  492. ('voted_on', models.DateTimeField(default=django.utils.timezone.now)),
  493. ('choice_hash', models.CharField(db_index=True, max_length=12)),
  494. (
  495. 'category', models.ForeignKey(
  496. on_delete=django.db.models.deletion.CASCADE,
  497. to='misago_categories.Category'
  498. )
  499. ),
  500. (
  501. 'poll', models.ForeignKey(
  502. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Poll'
  503. )
  504. ),
  505. (
  506. 'thread', models.ForeignKey(
  507. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'
  508. )
  509. ),
  510. (
  511. 'voter', models.ForeignKey(
  512. blank=True,
  513. null=True,
  514. on_delete=django.db.models.deletion.SET_NULL,
  515. to=settings.AUTH_USER_MODEL
  516. )
  517. ),
  518. ],
  519. ),
  520. migrations.AlterIndexTogether(
  521. name='pollvote',
  522. index_together=set([
  523. ('poll', 'voter_name'),
  524. ]),
  525. ),
  526. migrations.CreateModel(
  527. name='PostLike',
  528. fields=[
  529. (
  530. 'id', models.AutoField(
  531. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  532. )
  533. ),
  534. ('liker_name', models.CharField(max_length=255, db_index=True)),
  535. ('liker_slug', models.CharField(max_length=255)),
  536. ('liker_ip', models.GenericIPAddressField()),
  537. ('liked_on', models.DateTimeField(default=django.utils.timezone.now)),
  538. (
  539. 'category', models.ForeignKey(
  540. on_delete=django.db.models.deletion.CASCADE,
  541. to='misago_categories.Category'
  542. )
  543. ),
  544. ],
  545. options={
  546. 'ordering': ['-id'],
  547. },
  548. ),
  549. migrations.AddField(
  550. model_name='postlike',
  551. name='post',
  552. field=models.ForeignKey(
  553. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Post'
  554. ),
  555. ),
  556. migrations.AddField(
  557. model_name='postlike',
  558. name='thread',
  559. field=models.ForeignKey(
  560. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'
  561. ),
  562. ),
  563. migrations.AddField(
  564. model_name='postlike',
  565. name='liker',
  566. field=models.ForeignKey(
  567. blank=True,
  568. null=True,
  569. on_delete=django.db.models.deletion.SET_NULL,
  570. to=settings.AUTH_USER_MODEL
  571. ),
  572. ),
  573. migrations.AddField(
  574. model_name='post',
  575. name='liked_by',
  576. field=models.ManyToManyField(
  577. related_name='liked_post_set',
  578. through='misago_threads.PostLike',
  579. to=settings.AUTH_USER_MODEL
  580. ),
  581. ),
  582. ]