fields.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import datetime
  2. from django.conf import settings
  3. from django.utils.translation import ugettext_lazy as _
  4. from missing import timezone
  5. import mongoengine
  6. GENDER_CHOICES = (
  7. ('male', _("male")),
  8. ('female', _("female")),
  9. )
  10. ERROR_MESSAGES = {
  11. 'bounds': _("Value is out of bounds."),
  12. 'callable': _("Callable did not return datetime.date or datetime.datetime object."),
  13. }
  14. def limit_date(value, lower_limit, upper_limit, error):
  15. if not value:
  16. return
  17. if upper_limit:
  18. tmp_value = value
  19. if callable(upper_limit):
  20. tmp_upper_limit = upper_limit()
  21. if not isinstance(tmp_upper_limit, (datetime.datetime, datetime.date)):
  22. error('callable')
  23. else:
  24. tmp_upper_limit = upper_limit
  25. # If one object doesn't contain time (is date type), convert the other one to date object
  26. if not isinstance(tmp_value, datetime.datetime) or not isinstance(tmp_upper_limit, datetime.datetime):
  27. if isinstance(tmp_upper_limit, datetime.datetime):
  28. tmp_upper_limit = timezone.to_date(tmp_upper_limit)
  29. elif isinstance(tmp_value, datetime.datetime):
  30. tmp_value = timezone.to_date(tmp_value)
  31. if tmp_value > tmp_upper_limit:
  32. error('bounds')
  33. if lower_limit:
  34. tmp_value = value
  35. if callable(lower_limit):
  36. tmp_lower_limit = lower_limit()
  37. if not isinstance(tmp_lower_limit, (datetime.datetime, datetime.date)):
  38. error('callable')
  39. else:
  40. tmp_lower_limit = lower_limit
  41. # If one object doesn't contain time (is date type), convert the other one to date object
  42. if not isinstance(tmp_value, datetime.datetime) or not isinstance(tmp_lower_limit, datetime.datetime):
  43. if isinstance(tmp_lower_limit, datetime.datetime):
  44. tmp_lower_limit = timezone.to_date(tmp_lower_limit)
  45. elif isinstance(tmp_value, datetime.datetime):
  46. tmp_value = timezone.to_date(tmp_value)
  47. if tmp_value < tmp_lower_limit:
  48. error('bounds')
  49. class LanguageField(mongoengine.StringField):
  50. def __init__(self, *args, **kwargs):
  51. kwargs.setdefault('max_length', 5)
  52. kwargs.setdefault('choices', settings.LANGUAGES)
  53. kwargs.setdefault('default', settings.LANGUAGE_CODE)
  54. super(LanguageField, self).__init__(*args, **kwargs)
  55. class GenderField(mongoengine.StringField):
  56. def __init__(self, *args, **kwargs):
  57. kwargs.setdefault('max_length', 6)
  58. kwargs.setdefault('choices', GENDER_CHOICES)
  59. kwargs.setdefault('default', None)
  60. super(GenderField, self).__init__(*args, **kwargs)
  61. class LimitedDateTimeField(mongoengine.DateTimeField):
  62. """
  63. A datetime field which can check also upper and lower limit arguments.
  64. """
  65. def __init__(self, upper_limit=None, lower_limit=None, *args, **kwargs):
  66. self.upper_limit = upper_limit
  67. self.lower_limit = lower_limit
  68. if self.upper_limit and not callable(self.upper_limit) and not isinstance(self.upper_limit, (datetime.datetime, datetime.date)):
  69. self.error(u"Invalid upper_limit argument.")
  70. if self.lower_limit and not callable(self.lower_limit) and not isinstance(self.lower_limit, (datetime.datetime, datetime.date)):
  71. self.error(u"Invalid lower_limit argument.")
  72. super(LimitedDateTimeField, self).__init__(*args, **kwargs)
  73. def validate(self, value):
  74. super(LimitedDateTimeField, self).validate(value)
  75. def error(message):
  76. self.error(ERROR_MESSAGES[message])
  77. limit_date(value, self.lower_limit, self.upper_limit, error)