forms.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import json
  2. from django import forms
  3. from django.core.exceptions import ValidationError
  4. from django.db.models import Q
  5. try:
  6. from django.apps import apps
  7. get_model = apps.get_model
  8. except ImportError:
  9. from django.db.models.loading import get_model
  10. import operator
  11. from jet.models import Bookmark, PinnedApplication, UserDashboardModule
  12. from jet.utils import get_current_dashboard, get_model_instance_label
  13. class AddBookmarkForm(forms.ModelForm):
  14. def __init__(self, request, *args, **kwargs):
  15. self.request = request
  16. super(AddBookmarkForm, self).__init__(*args, **kwargs)
  17. class Meta:
  18. model = Bookmark
  19. fields = ['url', 'title']
  20. def save(self, commit=True):
  21. self.instance.user = self.request.user.pk
  22. return super(AddBookmarkForm, self).save(commit)
  23. class RemoveBookmarkForm(forms.ModelForm):
  24. def __init__(self, request, *args, **kwargs):
  25. self.request = request
  26. super(RemoveBookmarkForm, self).__init__(*args, **kwargs)
  27. class Meta:
  28. model = Bookmark
  29. fields = []
  30. def clean(self):
  31. cleaned_data = super(RemoveBookmarkForm, self).clean()
  32. if self.instance.user != self.request.user.pk:
  33. raise ValidationError('error')
  34. return cleaned_data
  35. def save(self, commit=True):
  36. if commit:
  37. self.instance.delete()
  38. class ToggleApplicationPinForm(forms.ModelForm):
  39. def __init__(self, request, *args, **kwargs):
  40. self.request = request
  41. super(ToggleApplicationPinForm, self).__init__(*args, **kwargs)
  42. class Meta:
  43. model = PinnedApplication
  44. fields = ['app_label']
  45. def save(self, commit=True):
  46. if commit:
  47. try:
  48. pinned_app = PinnedApplication.objects.get(
  49. app_label=self.cleaned_data['app_label'],
  50. user=self.request.user.pk
  51. )
  52. pinned_app.delete()
  53. return False
  54. except PinnedApplication.DoesNotExist:
  55. PinnedApplication.objects.create(
  56. app_label=self.cleaned_data['app_label'],
  57. user=self.request.user.pk
  58. )
  59. return True
  60. class UpdateDashboardModulesForm(forms.Form):
  61. app_label = forms.CharField(required=False)
  62. modules = forms.CharField()
  63. modules_objects = []
  64. def __init__(self, request, *args, **kwargs):
  65. self.request = request
  66. super(UpdateDashboardModulesForm, self).__init__(*args, **kwargs)
  67. def clean(self):
  68. data = super(UpdateDashboardModulesForm, self).clean()
  69. try:
  70. modules = json.loads(data['modules'])
  71. for module in modules:
  72. db_module = UserDashboardModule.objects.get(
  73. user=self.request.user.pk,
  74. app_label=data['app_label'] if data['app_label'] else None,
  75. pk=module['id']
  76. )
  77. column = module['column']
  78. order = module['order']
  79. if db_module.column != column or db_module.order != order:
  80. db_module.column = column
  81. db_module.order = order
  82. self.modules_objects.append(db_module)
  83. except Exception:
  84. raise ValidationError('error')
  85. return data
  86. def save(self):
  87. for module in self.modules_objects:
  88. module.save()
  89. class AddUserDashboardModuleForm(forms.ModelForm):
  90. type = forms.CharField()
  91. module = forms.IntegerField()
  92. module_cls = None
  93. def __init__(self, request, *args, **kwargs):
  94. self.request = request
  95. super(AddUserDashboardModuleForm, self).__init__(*args, **kwargs)
  96. class Meta:
  97. model = UserDashboardModule
  98. fields = ['app_label']
  99. def clean_app_label(self):
  100. data = self.cleaned_data['app_label']
  101. return data if data != '' else None
  102. def clean(self):
  103. data = super(AddUserDashboardModuleForm, self).clean()
  104. index_dashboard_cls = get_current_dashboard('app_index' if data['app_label'] else 'index')
  105. index_dashboard = index_dashboard_cls({'request': self.request}, app_label=data['app_label'])
  106. if data['type'] == 'children':
  107. module = index_dashboard.children[data['module']]
  108. elif data['type'] == 'available_children':
  109. module = index_dashboard.available_children[data['module']]()
  110. else:
  111. raise ValidationError('error')
  112. self.module_cls = module
  113. return data
  114. def save(self, commit=True):
  115. self.instance.title = self.module_cls.title
  116. self.instance.module = self.module_cls.fullname()
  117. self.instance.user = self.request.user.pk
  118. self.instance.column = 0
  119. self.instance.order = -1
  120. self.instance.settings = self.module_cls.dump_settings()
  121. self.instance.children = self.module_cls.dump_children()
  122. return super(AddUserDashboardModuleForm, self).save(commit)
  123. class UpdateDashboardModuleCollapseForm(forms.ModelForm):
  124. def __init__(self, request, *args, **kwargs):
  125. self.request = request
  126. super(UpdateDashboardModuleCollapseForm, self).__init__(*args, **kwargs)
  127. class Meta:
  128. model = UserDashboardModule
  129. fields = ['collapsed']
  130. def clean(self):
  131. data = super(UpdateDashboardModuleCollapseForm, self).clean()
  132. if self.instance.user != self.request.user.pk:
  133. raise ValidationError('error')
  134. return data
  135. class RemoveDashboardModuleForm(forms.ModelForm):
  136. def __init__(self, request, *args, **kwargs):
  137. self.request = request
  138. super(RemoveDashboardModuleForm, self).__init__(*args, **kwargs)
  139. class Meta:
  140. model = UserDashboardModule
  141. fields = []
  142. def clean(self):
  143. cleaned_data = super(RemoveDashboardModuleForm, self).clean()
  144. if self.instance.user != self.request.user.pk:
  145. raise ValidationError('error')
  146. return cleaned_data
  147. def save(self, commit=True):
  148. if commit:
  149. self.instance.delete()
  150. class ModelLookupForm(forms.Form):
  151. app_label = forms.CharField()
  152. model = forms.CharField()
  153. q = forms.CharField(required=False)
  154. page = forms.IntegerField(required=False)
  155. page_size = forms.IntegerField(required=False, min_value=1, max_value=1000)
  156. object_id = forms.IntegerField(required=False)
  157. model_cls = None
  158. def clean(self):
  159. data = super(ModelLookupForm, self).clean()
  160. try:
  161. self.model_cls = get_model(data['app_label'], data['model'])
  162. except:
  163. raise ValidationError('error')
  164. return data
  165. def lookup(self):
  166. qs = self.model_cls.objects
  167. if self.cleaned_data['q']:
  168. if getattr(self.model_cls, 'autocomplete_search_fields', None):
  169. search_fields = self.model_cls.autocomplete_search_fields()
  170. filter_data = [Q((field + '__icontains', self.cleaned_data['q'])) for field in search_fields]
  171. # if self.cleaned_data['object_id']:
  172. # filter_data.append(Q(pk=self.cleaned_data['object_id']))
  173. qs = qs.filter(reduce(operator.or_, filter_data))
  174. else:
  175. qs = qs.none()
  176. limit = self.cleaned_data['page_size'] or 100
  177. page = self.cleaned_data['page'] or 1
  178. offset = (page - 1) * limit
  179. items = map(
  180. lambda instance: {'id': instance.pk, 'text': get_model_instance_label(instance)},
  181. qs.all()[offset:offset + limit]
  182. )
  183. total = qs.count()
  184. return items, total