0001_initial.py 24 KB

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