Source code for pyforms_web.controls.control_querycombo

from pyforms_web.controls.control_base import ControlBase
import simplejson, collections
from django.apps import apps

[docs]class ControlQueryCombo(ControlBase): def __init__(self, *args, **kwargs): super(ControlQueryCombo, self).__init__(*args, **kwargs) # these informations is needed to serialize the control to the drive self._app = None self._model = None self._query = None self.allow_none = kwargs.get('allow_none', False) self._column = kwargs.get('display_column', 'pk') #################################################################### self.queryset = kwargs.get('queryset', None) def init_form(self): return "new ControlQueryCombo('{0}', {1})".format( self._name, simplejson.dumps(self.serialize()) ) def serialize(self): data = ControlBase.serialize(self) items = [] if self.allow_none: items.append({'label': '---', 'value': None}) for obj in self.queryset: if self._column: items.append({'label': str(getattr(obj,self._column)), 'value': obj.pk }) else: items.append({'label': str(obj), 'value': obj.pk }) data.update({ 'items': items, 'value': self._value }) return data @property def display_column(self): return self._column @property def display_column(self): return self._column @property def queryset(self): if self._app and self._model and self._query: # reconstruct the query ################################ model = apps.get_model(self._app, self._model) qs = model.objects.all() qs.query = self._query return qs else: return None @queryset.setter def queryset(self, value): if value: self._model = value.model._meta.label.split('.')[-1] self._query = value.query self._app = value.model._meta.app_label self.value = None if self.allow_none else (value[0].pk if value.count()>0 else None) else: self._model = None self._query = None self._app = None def deserialize(self, properties): """ Serialize the control data. :param dict properties: Serialized data to load. """ if properties.get('value','null')=='null': properties['value'] = None super().deserialize(properties)