models.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. from datetime import datetime
  2. from django.db import models
  3. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
  4. from django.contrib.contenttypes.models import ContentType
  5. class BaseModel(models.Model):
  6. created_at = models.DateTimeField(auto_now_add=True)
  7. updated_at = models.DateTimeField(auto_now=True)
  8. class Meta:
  9. abstract = True
  10. class Note(BaseModel):
  11. """Pice of text to remember"""
  12. title = models.CharField(max_length=255, null=True, blank=True)
  13. body = models.TextField()
  14. content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
  15. object_id = models.PositiveIntegerField()
  16. content_object = GenericForeignKey()
  17. def __str__(self):
  18. return "<Note: {} {}>".format(self.object_id, self.content_object)
  19. class Task(BaseModel):
  20. """Pice of work to be done"""
  21. UNPRIORITIZED = "Unprioritized"
  22. HIGHT = "Hight"
  23. MEDIUM = "Medium"
  24. LOW = "Low"
  25. PRIORITY_CHOICES = ((0, UNPRIORITIZED), (1, HIGHT), (2, MEDIUM), (3, LOW))
  26. title = models.CharField(max_length=255)
  27. description = models.TextField()
  28. due_date = models.DateTimeField(blank=True, null=True)
  29. priority = models.IntegerField(default=0, choices=PRIORITY_CHOICES)
  30. completed = models.BooleanField(blank=True)
  31. completed_at = models.DateTimeField(blank=True, null=True)
  32. notes = GenericRelation(Note)
  33. def __str__(self):
  34. return "<Task: {} {} {}>".format(self.title, self.due_date, self.priority)
  35. class Plan(BaseModel):
  36. """Handle tasks together"""
  37. title = models.CharField(max_length=255)
  38. goal = models.CharField(max_length=255)
  39. tasks = models.ManyToManyField(Task)
  40. def __str__(self):
  41. return "<Plan: {}>".format(self.title)
  42. class Issue(BaseModel):
  43. """Anything that stops you from moving forward"""
  44. title = models.CharField(max_length=255, null=True, blank=True)
  45. description = models.TextField()
  46. mitigation = models.TextField()
  47. def __str__(self):
  48. return "<Issue: {}>".format(self.title)
  49. class Project(BaseModel):
  50. """Keep track personal (and not so) projects"""
  51. title = models.CharField(max_length=255)
  52. description = models.TextField()
  53. reason = models.TextField() # Reason to spent any time on that; what's the benefit?
  54. plans = models.ManyToManyField(Plan)
  55. notes = GenericRelation(Note)
  56. def __str__(self):
  57. return "<Project: {}>".format(self.title)
  58. class Material(BaseModel):
  59. """Data to be processed (tarbals, csv files..)"""
  60. title = models.CharField(max_length=255)
  61. file = models.FileField()
  62. notes = GenericRelation(Note)
  63. def __str__(self):
  64. return "<Material: {}>".format(self.title)
  65. class Book(BaseModel):
  66. """Keep track of your books"""
  67. title = models.CharField(max_length=255)
  68. author = models.CharField(max_length=255, blank=True, null=True)
  69. scale = models.PositiveIntegerField()
  70. position = models.PositiveIntegerField()
  71. notes = GenericRelation(Note)
  72. resume = models.TextField(blank=True, null=True)
  73. completed = models.BooleanField(blank=True)
  74. completed_at = models.DateTimeField(blank=True, null=True)
  75. materials = models.ForeignKey(Material, blank=True, null=True, on_delete=models.CASCADE)
  76. def __str__(self):
  77. return "<Book: {} {} {}>".format(self.title, self.author, self.position)
  78. class BookStackRecord(BaseModel):
  79. """Represent books in the stack."""
  80. position = models.PositiveIntegerField()
  81. book = models.OneToOneField(Book, on_delete=models.SET_NULL, null=True)
  82. def __str__(self):
  83. return "<BookStackRecord: {}>".format(self.position)
  84. class Course(BaseModel):
  85. """Educational course"""
  86. title = models.CharField(max_length=255)
  87. info = models.TextField(max_length=255)
  88. reason = models.TextField()
  89. link = models.URLField()
  90. progress = models.PositiveIntegerField()
  91. completed = models.BooleanField(blank=True)
  92. completed_at = models.DateTimeField(blank=True, null=True)
  93. materials = models.ForeignKey(Material, blank=True, null=True, on_delete=models.CASCADE)
  94. notes = GenericRelation(Note)
  95. def __str__(self):
  96. return "<Course: {}: {}>".format(self.title, self.progress)
  97. class CourseStackRecord(BaseModel):
  98. """Represent course in the stack."""
  99. position = models.PositiveIntegerField()
  100. course = models.OneToOneField(Course, on_delete=models.SET_NULL, null=True)
  101. def __str__(self):
  102. return "<CourseStackRecord: {}>".format(self.position)
  103. class PersonOfInterest(BaseModel):
  104. """Book authors, bloggers, coders, journalists to whatch"""
  105. name = models.CharField(max_length=255)
  106. notes = GenericRelation(Note)
  107. def __str__(self):
  108. return self.name
  109. class Story(BaseModel):
  110. """Day-to-day writings lie here"""
  111. name = models.CharField(max_length=255, default=datetime.now())
  112. content = models.TextField()
  113. def __str__(self):
  114. return "<Story: {} {}>".format(self.name, self.created_at)
  115. class Timeline(models.Model):
  116. """Represent time in chunks of 52 weeks"""
  117. class Week(models.Model):
  118. """To track goals, progress and tasks"""
  119. number = models.PositiveIntegerField()
  120. start_date = models.DateField()
  121. end_date = models.DateField()
  122. goal = models.CharField(max_length=255)
  123. summary = models.TextField(blank=True, null=True)
  124. year = models.PositiveIntegerField(default=datetime.today().year)
  125. def __str__(self):
  126. return "<Week: {} - {}>".format(self.number, self.goal)
  127. class Site(BaseModel):
  128. """Sites I'm registered in"""
  129. # TODO: add relation from `notes' -- allow create some kind of comments\notes
  130. # about something from site (interesting posts, receips)..
  131. # Schedule events basing on site urls
  132. RANK_CHOICES = (
  133. (1, 'Superb'),
  134. (2, 'Good'),
  135. (3, 'Bad'),
  136. (4, 'Aweful')
  137. )
  138. name = models.CharField(max_length=255)
  139. url = models.URLField(max_length=300)
  140. description = models.TextField(blank=True, null=True)
  141. rank = models.PositiveIntegerField(choices=RANK_CHOICES, default=0)
  142. def __str__(self):
  143. return "<Site: {}>".format(self.name)