def invalidate_data_mart_before_save(sender, instance, **kwargs): if instance.id is not None: try: original = sender._default_manager.get(pk=instance.id) if original.parent_id != instance.parent_id: if original.active != instance.active: DataMartModel.clear_children_buffer( ) # Clear children buffer instance._parent_id_validate = True else: keys = get_children_keys(sender, original.parent_id) cache.delete_many(keys) else: if original.active != instance.active: if instance.active: parent_id_list = list(original.get_family().exclude( lft=F('rght') - 1).values_list('id', flat=True)) parent_id_list.append(None) else: parent_id_list = list( original.get_descendants( include_self=True).exclude( lft=F('rght') - 1).values_list('id', flat=True)) parent_id_list.append(original.parent_id) keys = [] for parent_id in parent_id_list: keys.extend(get_children_keys(sender, parent_id)) cache.delete_many(keys) instance._parent_id_validate = True except sender.DoesNotExist: pass
def __init__(self, *args, **kwargs): """ Конструктор для корректного отображения объектов """ instance = kwargs.get('instance', None) super(DataMartAdminForm, self).__init__(*args, **kwargs) if instance is not None: entity_model = instance.entities_model else: entity_model = DataMartModel.get_base_entity_model() self.fields['ordering'].choices = entity_model.ORDERING_MODES self.fields['view_component'].choices = entity_model.VIEW_COMPONENTS
def __init__(self, *args, **kwargs): """ Конструктор для корректного отображения объектов """ entities_model = kwargs.pop('entities_model', None) super(EntitiesUpdateStateAdminForm, self).__init__(*args, **kwargs) if entities_model is None: entities_model = DataMartModel.get_base_entity_model() transition_states = getattr(entities_model, 'TRANSITION_TARGETS', {}) if transition_states: choices = [] for k, v in transition_states.items(): choices.append((k, v)) self.fields['state'].choices = choices
def update_states(modeladmin, request, queryset): """ ENG: Update states for multiple entities RUS: Обновляет состояния для нескольких объектов """ CHUNK_SIZE = getattr(settings, 'EDW_UPDATE_STATES_ACTION_CHUNK_SIZE', 100) opts = modeladmin.model._meta app_label = opts.app_label try: terms_ids = queryset[0].terms.values_list('id', flat=True) except IndexError: entities_model = DataMartModel.get_base_entity_model() else: entities_model = DataMartModel.get_entities_model(terms_ids) if request.POST.get('post'): form = EntitiesUpdateStateAdminForm(request.POST, entities_model=entities_model) if form.is_valid(): state = form.cleaned_data['state'] n = queryset.count() if n and state: i = 0 tasks = [] while i < n: chunk = queryset[i:i + CHUNK_SIZE] for obj in chunk: obj_display = force_text(obj) modeladmin.log_change(request, obj, obj_display) tasks.append(update_entities_states.si([x.id for x in chunk], state)) i += CHUNK_SIZE chain(reduce(OR, tasks)).apply_async() modeladmin.message_user(request, _("Successfully proceed %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }) # Return None to display the change list page again. return None else: form = EntitiesUpdateStateAdminForm(entities_model=entities_model) if len(queryset) == 1: objects_name = force_text(opts.verbose_name) else: objects_name = force_text(opts.verbose_name_plural) title = _("Update state for multiple entities") context = { "title": title, 'form': form, "objects_name": objects_name, 'queryset': queryset, "opts": opts, "app_label": app_label, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'media': modeladmin.media, 'action': 'update_states', } # Display the confirmation page kwargs = {} return TemplateResponse(request, "edw/admin/entities/actions/update_states.html", context, **kwargs)
def data_mart_rel_ids(self): return DataMartModel.separate_relations(self.data_mart_relations)
def data_mart_relations_subjects(self): return DataMartModel.get_relations_subjects(self.data_mart_relations)
def on_cache_set(key): buf = DataMartModel.get_children_buffer() old_key = buf.record(key) if old_key != buf.empty: cache.delete(old_key)