items.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from dataclasses import dataclass, field
  2. from datetime import datetime
  3. from .mixins import SchemaMixin, DbMixin
  4. from .milestones import Milestone
  5. from .sprints import Sprint
  6. @dataclass(repr=False)
  7. class Item(SchemaMixin, DbMixin):
  8. document: dict
  9. name: str
  10. description: str
  11. category: str
  12. milestone_id: int = None
  13. milestone: Milestone = field(init=False)
  14. sprint_id: int = None
  15. sprint: Sprint = field(init=False)
  16. uuid: str = None
  17. date_added: datetime = None
  18. date_expected: datetime = None
  19. date_started: datetime = None
  20. schema_yaml = """
  21. name:
  22. required: true
  23. type: string
  24. is_unique_with:
  25. table: sprint
  26. fields:
  27. - milestone_id
  28. - sprint_id
  29. description:
  30. required: true
  31. type: string
  32. category:
  33. required: true
  34. type: string
  35. allowed:
  36. - feature
  37. - limitation
  38. - constraint
  39. - unknown
  40. milestone_id:
  41. is_fk: milestone
  42. excludes: sprint_id
  43. required: true
  44. sprint_id:
  45. is_fk: sprint
  46. excludes: milestone_id
  47. required: true
  48. date_added:
  49. type: datetime
  50. default_setter: utcnow
  51. date_expected:
  52. type: date
  53. date_started:
  54. type: date
  55. """
  56. def __post_init__(self):
  57. self.milestone = Milestone.fetch(self.milestone_id) if self.milestone_id else None
  58. self.sprint = Sprint.fetch(self.sprint_id) if self.sprint_id else None
  59. @classmethod
  60. def get(cls, document):
  61. category_to_kls = {
  62. 'feature': Feature,
  63. 'limitation': Limitation,
  64. 'constraint': Constraint,
  65. 'unknown': Unknown,
  66. }
  67. kls = category_to_kls[document.get('category')]
  68. return kls(document=document, **document)
  69. def __repr__(self):
  70. return "{}(name='{}', milestone='{}')".format(self.__class__.__qualname__, self.name, repr(self.milestone))
  71. def __terminal__(self):
  72. return f"{self.__class__.__qualname__} : {self.name} ({self.sprint or self.milestone})"
  73. class Limitation(Item):
  74. ...
  75. class Feature(Item):
  76. ...
  77. class Constraint(Item):
  78. ...
  79. class Unknown(Item):
  80. ...