Example #1
0
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
Example #2
0
 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
Example #3
0
 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
Example #4
0
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)
Example #5
0
 def data_mart_rel_ids(self):
     return DataMartModel.separate_relations(self.data_mart_relations)
Example #6
0
 def data_mart_relations_subjects(self):
     return DataMartModel.get_relations_subjects(self.data_mart_relations)
Example #7
0
 def on_cache_set(key):
     buf = DataMartModel.get_children_buffer()
     old_key = buf.record(key)
     if old_key != buf.empty:
         cache.delete(old_key)