Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

values.py 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import warnings
  2. from django import template
  3. from django.conf import settings
  4. from classytags.compat import compat_basestring
  5. from classytags.exceptions import TemplateSyntaxWarning
  6. class StringValue(object):
  7. errors = {}
  8. value_on_error = ""
  9. def __init__(self, var):
  10. self.var = var
  11. try:
  12. # django.template.base.Variable
  13. self.literal = self.var.literal
  14. except AttributeError:
  15. # django.template.base.FilterExpression
  16. self.literal = self.var.token
  17. def resolve(self, context):
  18. resolved = self.var.resolve(context)
  19. return self.clean(resolved)
  20. def clean(self, value):
  21. return value
  22. def error(self, value, category):
  23. data = self.get_extra_error_data()
  24. data['value'] = repr(value)
  25. message = self.errors.get(category, "") % data
  26. if settings.DEBUG:
  27. raise template.TemplateSyntaxError(message)
  28. else:
  29. warnings.warn(message, TemplateSyntaxWarning)
  30. return self.value_on_error
  31. def get_extra_error_data(self):
  32. return {}
  33. class StrictStringValue(StringValue):
  34. errors = {
  35. "clean": "%(value)s is not a string",
  36. }
  37. value_on_error = ""
  38. def clean(self, value):
  39. if not isinstance(value, compat_basestring):
  40. return self.error(value, "clean")
  41. return value
  42. class IntegerValue(StringValue):
  43. errors = {
  44. "clean": "%(value)s could not be converted to Integer",
  45. }
  46. value_on_error = 0
  47. def clean(self, value):
  48. try:
  49. return int(value)
  50. except ValueError:
  51. return self.error(value, "clean")
  52. class ListValue(list, StringValue):
  53. """
  54. A list of template variables for easy resolving
  55. """
  56. def __init__(self, value):
  57. list.__init__(self)
  58. self.append(value)
  59. def resolve(self, context):
  60. resolved = [item.resolve(context) for item in self]
  61. return self.clean(resolved)
  62. class DictValue(dict, StringValue):
  63. def __init__(self, value):
  64. dict.__init__(self, value)
  65. def resolve(self, context):
  66. resolved = dict(
  67. [(key, value.resolve(context)) for key, value in self.items()]
  68. )
  69. return self.clean(resolved)
  70. class ChoiceValue(StringValue):
  71. errors = {
  72. "choice": "%(value)s is not a valid choice. Valid choices: "
  73. "%(choices)s.",
  74. }
  75. choices = []
  76. def clean(self, value):
  77. cleaned = super(ChoiceValue, self).clean(value)
  78. if cleaned in self.choices:
  79. return cleaned
  80. else:
  81. return self.error(cleaned, "choice")
  82. def get_extra_error_data(self):
  83. data = super(ChoiceValue, self).get_extra_error_data()
  84. data['choices'] = self.choices
  85. return data