"""This file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license. """ from data_manager.prepare_params import PrepareParams from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ class ViewBaseModel(models.Model): data = models.JSONField(_('data'), default=dict, null=True, help_text='Custom view data') ordering = models.JSONField(_('ordering'), default=dict, null=True, help_text='Ordering parameters') order = models.IntegerField( _('order'), default=0, null=True, help_text='Position of the tab, starting at the left in data manager and increasing as the tabs go left to right', ) selected_items = models.JSONField(_('selected items'), default=dict, null=True, help_text='Selected items') filter_group = models.ForeignKey( 'data_manager.FilterGroup', null=True, on_delete=models.SET_NULL, help_text='Groups of filters' ) user = models.ForeignKey( settings.AUTH_USER_MODEL, related_name='%(app_label)s_%(class)ss', on_delete=models.CASCADE, help_text='User who made this view', null=True, ) class Meta: ordering = ['order', 'id'] indexes = [models.Index(fields=['project', 'order'])] abstract = True class ProjectViewMixin(models.Model): project = models.ForeignKey( 'projects.Project', related_name='views', on_delete=models.CASCADE, help_text='Project ID' ) def has_permission(self, user): user.project = self.project # link for activity log if self.project.organization == user.active_organization: return True return False class Meta: abstract = True class View(ViewBaseModel, ProjectViewMixin): def get_prepare_tasks_params(self, add_selected_items=False): # Import here to avoid circular imports from data_manager.serializers import FilterGroupSerializer # convert filters to PrepareParams structure filters = None if self.filter_group: serializer = FilterGroupSerializer() filters = serializer.to_representation(self.filter_group) ordering = self.ordering if not ordering: ordering = [] # default empty json field is dict, but we need list selected_items = None if add_selected_items and self.selected_items: selected_items = self.selected_items return PrepareParams( project=self.project_id, ordering=ordering, filters=filters, data=self.data, selectedItems=selected_items ) class FilterGroup(models.Model): conjunction = models.CharField(_('conjunction'), max_length=1024, help_text='Type of conjunction') filters = models.ManyToManyField( 'data_manager.Filter', related_name='filter_groups', help_text='Connected filters' ) class Filter(models.Model): # Optional reference to a parent filter. We only allow **one** level of nesting. parent = models.ForeignKey( 'self', on_delete=models.CASCADE, related_name='children', null=True, blank=True, help_text='Optional parent filter to create one-level hierarchy (child filters are AND-merged with parent)', ) # `index` is now only meaningful for **root** filters (parent is NULL) index = models.IntegerField( _('index'), null=True, blank=True, default=None, help_text='Display order among root filters only', ) column = models.CharField(_('column'), max_length=1024, help_text='Field name') type = models.CharField(_('type'), max_length=1024, help_text='Field type') operator = models.CharField(_('operator'), max_length=1024, help_text='Filter operator') value = models.JSONField(_('value'), default=dict, null=True, help_text='Filter value')