0001_initial.py 24 KB

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