Ejemplo n.º 1
0
def unlink_activity(request):
    POST = request.POST
    activity_id = get_from_POST_or_404(POST, 'id')
    entity_id = get_from_POST_or_404(POST, 'object_id')
    entities = list(
        CremeEntity.objects.filter(pk__in=[activity_id, entity_id]))

    if len(entities) != 2:
        raise http.Http404(ugettext('One entity does not exist any more.'))

    has_perm = request.user.has_perm_to_unlink_or_die

    for entity in entities:
        has_perm(entity)

    types = (
        constants.REL_SUB_PART_2_ACTIVITY,
        constants.REL_SUB_ACTIVITY_SUBJECT,
        constants.REL_SUB_LINKED_2_ACTIVITY,
    )
    for relation in Relation.objects.filter(subject_entity=entity_id,
                                            type__in=types,
                                            object_entity=activity_id):
        relation.delete()

    return http.HttpResponse()
Ejemplo n.º 2
0
def set_selected(request):
    POST = request.POST
    field_id = get_from_POST_or_404(POST, 'field_id', cast=int)
    report_id = get_from_POST_or_404(POST, 'report_id', cast=int)

    try:
        checked = bool(int(POST.get('checked', 0)))
    except ValueError:
        checked = False

    with atomic():
        report = get_object_or_404(Report.objects.select_for_update(),
                                   id=report_id)
        request.user.has_perm_to_change_or_die(report)

        rfield = get_object_or_404(Field, id=field_id)

        if rfield.report_id != report.id:
            raise ConflictError('This Field & this Report do not match.')

        if not rfield.sub_report_id:
            raise ConflictError(
                'This Field has no Report, so can no be (un)selected')

        report = rfield.report

        if rfield.selected != checked:
            if checked:  # Only one Field should be selected
                report.fields.exclude(pk=rfield.pk).update(selected=False)

            rfield.selected = checked
            rfield.save()

    return HttpResponse()
Ejemplo n.º 3
0
    def get_update_kwargs(self):
        POST = self.request.POST

        return {
            'segment_desc_id': get_from_POST_or_404(POST, self.segment_desc_id_arg, int),
            'orga_id':         get_from_POST_or_404(POST, self.orga_id_arg, int),
            'score':           get_from_POST_or_404(POST, self.score_arg, int),
        }
Ejemplo n.º 4
0
    def test_get_from_request_or_404(self):
        request = {'name': 'robert', 'age': '36'}

        self.assertRaises(Http404, get_from_GET_or_404, request, 'name_')  # Key error
        self.assertRaises(Http404, get_from_GET_or_404, request, 'name', int)  # Cast error
        self.assertRaises(Http404, get_from_GET_or_404, request, 'name_', int, default='string')  # Cast error

        self.assertEqual('36', get_from_POST_or_404(request, 'age'))
        self.assertEqual(36, get_from_POST_or_404(request, 'age', int))
        self.assertEqual(1,  get_from_POST_or_404(request, 'name_', int, default=1))
Ejemplo n.º 5
0
    def post(self, request, **kwargs):
        strategy = self.get_related_entity()

        POST = request.POST
        segment_desc_id = get_from_POST_or_404(POST, self.segment_desc_id_arg, int)
        orga_id         = get_from_POST_or_404(POST, self.orga_id_arg,         int)
        category        = get_from_POST_or_404(POST, self.category_id_arg,     int)

        try:
            strategy.set_segment_category(segment_desc_id, orga_id, category)
        except Exception as e:
            raise Http404(str(e)) from e

        return HttpResponse()
Ejemplo n.º 6
0
    def perform_deletion(self, request):
        cell_key = get_from_POST_or_404(request.POST, self.cell_key_arg)
        self.object = cfci = self.get_cfci_for_update()
        desc = self.get_customform_descriptor()

        groups = []
        found = False
        for group in self.get_groups():
            cells = []

            # TODO: better API for group.cells ?
            for cell in getattr(group, 'cells', ()):
                if cell.key != cell_key:
                    cells.append(cell)
                else:
                    found = True

            groups.append(
                FieldGroup(name=group.name, cells=cells, layout=group.layout
                           ) if found else group)

        if not found:
            raise Http404(
                f'The cell with key="{cell_key}" has not been found.')

        cfci.store_groups(
            FieldGroupList(model=desc.model,
                           groups=groups,
                           cell_registry=desc.build_cell_registry()))
        cfci.save()
Ejemplo n.º 7
0
    def post(self, request, *args, **kwargs):
        layout = get_from_POST_or_404(request.POST, self.layout_arg)
        if layout not in LAYOUTS:
            raise ConflictError(f'The layout "{layout}" is invalid.')

        self.object = cfci = self.get_cfci_for_update()
        desc = self.get_customform_descriptor()
        group_id = self.get_group_id()

        # groups = [
        #     FieldGroup(name=group.name, cells=group.cells, layout=layout)
        #     if i == group_id else
        #     group
        #     for i, group in enumerate(self.get_groups())
        # ]
        groups = [*self.get_groups()]
        groups[group_id]._layout = layout

        cfci.store_groups(
            FieldGroupList(
                model=desc.model,
                groups=groups,
                cell_registry=desc.build_cell_registry(),
            ))
        cfci.save()  # TODO: only if changed ?

        return HttpResponse()
Ejemplo n.º 8
0
def resend_mails(request):
    ids = get_from_POST_or_404(request.POST, 'ids').split(',')

    for email in EntityEmail.objects.filter(pk__in=ids):
        email.send()

    return {}
Ejemplo n.º 9
0
def _create_failed_pcall(request):
    POST = request.POST
    start = _build_date_or_404(get_from_POST_or_404(POST, 'call_start'))

    user = request.user
    user.has_perm_to_create_or_die(Activity)  # TODO: test

    me, person = _get_participants(user, POST)

    pcall = failed_activity_creator(
        user=user,
        title=_('{status} call to {person} from Creme Mobile').format(
            status=_('Failed'),
            person=person,
        ),
        type_id=act_constants.ACTIVITYTYPE_PHONECALL,
        sub_type_id=act_constants.ACTIVITYSUBTYPE_PHONECALL_FAILED,
        status_id=act_constants.STATUS_DONE,
        start=start,
        end=start,
        minutes=POST.get('minutes', ''),
    )
    _add_participants(pcall, (me, person))

    return pcall, me, person
Ejemplo n.º 10
0
def delete(request):
    root_node = get_object_or_404(RootNode, pk=get_from_POST_or_404(request.POST, 'id'))

    request.user.has_perm_to_change_or_die(root_node.graph)
    root_node.delete()

    return HttpResponse()
Ejemplo n.º 11
0
def delete_instance_brick(request):
    get_object_or_404(
        InstanceBrickConfigItem,
        pk=get_from_POST_or_404(request.POST, 'id'),
    ).delete()

    return HttpResponse()
Ejemplo n.º 12
0
def delete_rtype_brick(request):
    get_object_or_404(
        RelationBrickItem,
        pk=get_from_POST_or_404(request.POST, 'id'),
    ).delete()

    return HttpResponse()
Ejemplo n.º 13
0
    def post(self, request, *args, **kwargs):
        target = get_from_POST_or_404(request.POST,
                                      self.target_order_arg,
                                      cast=int)

        self.object = cfci = self.get_cfci_for_update()
        desc = self.get_customform_descriptor()
        group_id = self.get_group_id()

        groups = [*self.get_groups()]
        if target > len(groups):
            raise ConflictError(f'The target "{target}" is too big.')

        moved_group = groups.pop(group_id)
        groups.insert(target, moved_group)

        cfci.store_groups(
            FieldGroupList(
                model=desc.model,
                groups=groups,
                cell_registry=desc.build_cell_registry(),
            ))
        cfci.save()  # TODO: only if changed ?

        return HttpResponse()
Ejemplo n.º 14
0
    def get_target_order(self):
        """Returns the future order (starting at 1) of the instance we want to move."""
        order = get_from_POST_or_404(self.request.POST, self.target_order_post_argument, int)
        if order < 1:
            raise ConflictError('Target order must be greater than or equal to 1.')

        return order
Ejemplo n.º 15
0
def _link(request, entity_id, relation_type_id):
    managed_orga  = get_object_or_404(get_organisation_model(),
                                      pk=get_from_POST_or_404(request.POST, 'id', int),
                                     )
    entity        = get_object_or_404(models.CremeEntity, pk=entity_id).get_real_entity()
    relation_type = get_object_or_404(models.RelationType, pk=relation_type_id)
    user = request.user

    # TODO: in a Relation type method() ??
    if not relation_type.subject_ctypes.filter(id=entity.entity_type_id).exists():
        raise Http404('Incompatible relation type for subject')  # TODO: ConflictError

    # TODO: in a Relation type method() ??
    if not relation_type.object_ctypes.filter(id=managed_orga.entity_type_id).exists():
        raise Http404('Incompatible relation type for object')  # TODO: ConflictError

    has_perm_or_die = user.has_perm_to_link_or_die
    has_perm_or_die(entity)
    has_perm_or_die(managed_orga)

    models.Relation.objects.safe_get_or_create(
        subject_entity=entity,
        type_id=relation_type_id,
        object_entity=managed_orga,
        user=user,
    )

    return HttpResponse()
Ejemplo n.º 16
0
    def perform_deletion(self, request):
        POST = request.POST
        ct_id = get_from_POST_or_404(POST, self.ct_id_arg, cast=int)

        if not ct_id:
            raise Http404('Default config can not be deleted')

        role_id = None
        superuser = False

        role_str = POST.get(self.role_arg)
        if role_str:
            if role_str == 'superuser':
                superuser = True
            else:
                try:
                    role_id = int(role_str)
                except ValueError:
                    raise Http404(
                        '"role" argument must be "superuser" or an integer')

        BrickDetailviewLocation.objects.filter(
            content_type=ct_id,
            role=role_id,
            superuser=superuser,
        ).delete()
Ejemplo n.º 17
0
    def post(self, request, *args, **kwargs):
        get_object_or_404(
            SetCredentials,
            id=get_from_POST_or_404(request.POST, self.creds_id_arg),
        ).delete()

        return HttpResponse()
Ejemplo n.º 18
0
    def post(self, request, **kwargs):
        value = utils.get_from_POST_or_404(
            request.POST,
            key=self.value_arg,
            cast=utils.bool_from_str_extended,
        )

        # NB: we can still have a race condition because we do not use
        #     select_for_update ; but it's a state related one user & one brick,
        #     so it would not be a real world problem.
        for _i in range(10):
            state = BrickState.objects.get_for_brick_id(
                brick_id=self.brick_cls.id_,
                user=request.user,
            )

            try:
                if state.set_extra_data(
                        key=BRICK_STATE_HIDE_DELETED_CFIELDS,
                        value=value,
                ):
                    state.save()
            except IntegrityError:
                logger.exception('Avoid a duplicate.')
                continue
            else:
                break

        return HttpResponse()
Ejemplo n.º 19
0
def delete_user_calendar(request):
    calendar = get_object_or_404(Calendar,
                                 pk=get_from_POST_or_404(request.POST, 'id'))
    user = request.user

    # TODO: factorise calendar credentials functions ?
    if not calendar.is_custom or (not user.is_superuser
                                  and calendar.user_id != user.id):
        raise PermissionDenied(
            ugettext('You are not allowed to delete this calendar.'))

    # Attach all existing activities to the default calendar
    replacement_calendar = Calendar.get_user_default_calendar(user)
    if replacement_calendar == calendar:
        replacement_calendar = Calendar.objects.filter(user=user)\
                                               .exclude(id=calendar.id)\
                                               .order_by('id')\
                                               .first()

        if replacement_calendar is None:
            raise ConflictError(
                ugettext('You cannot delete your last calendar.'))

    for activity in calendar.activity_set.all():
        activity.calendars.add(replacement_calendar)

    calendar.delete()
Ejemplo n.º 20
0
def delete_detailview(request):
    POST = request.POST
    ct_id = get_from_POST_or_404(POST, 'id', int)

    if not ct_id:
        raise Http404('Default config can not be deleted')

    role_id = None
    superuser = False

    role = POST.get('role')
    if role:
        if role == 'superuser':
            superuser = True
        else:
            try:
                role_id = int(role)
            except ValueError:
                raise Http404(
                    '"role" argument must be "superuser" or an integer')

    BrickDetailviewLocation.objects.filter(
        content_type=ct_id,
        role=role_id,
        superuser=superuser,
    ).delete()

    return HttpResponse()
Ejemplo n.º 21
0
    def post(self, request, *args, **kwargs):
        POST = request.POST
        start = get_from_POST_or_404(
            POST,
            key=self.start_arg,
            cast=_js_timestamp_to_datetime,
        )
        end = get_from_POST_or_404(POST,
                                   key=self.end_arg,
                                   cast=_js_timestamp_to_datetime)
        is_all_day = get_from_POST_or_404(
            POST,
            key=self.all_day_arg,
            cast=bool_from_str_extended,
            default='false',
        )

        activity = self.get_related_entity()

        # Dropping a floating Activity on the Calendar fixes it.
        if activity.floating_type == constants.FLOATING:
            activity.floating_type = constants.NARROW

        activity.start = start
        activity.end = end
        activity.is_all_day = is_all_day

        activity.handle_all_day()

        collisions = check_activity_collisions(
            activity.start,
            activity.end,
            participants=[
                r.object_entity for r in activity.get_participant_relations()
            ],
            busy=activity.busy,
            exclude_activity_id=activity.id,
        )

        if collisions:
            raise ConflictError(
                ', '.join(collisions))  # TODO: improve message?

        activity.save()

        return HttpResponse()
Ejemplo n.º 22
0
def delete_home(request):
    get_object_or_404(
        BrickHomeLocation,
        pk=get_from_POST_or_404(request.POST, 'id'),
        # app_name='creme_core',
    ).delete()

    return HttpResponse()
Ejemplo n.º 23
0
def delete_mypage(request):
    get_object_or_404(
        BrickMypageLocation,
        pk=get_from_POST_or_404(request.POST, 'id'),
        user=request.user,
    ).delete()

    return HttpResponse()
Ejemplo n.º 24
0
def set_segment_category(request, strategy_id):
    strategy = get_object_or_404(Strategy.objects.select_for_update(),
                                 pk=strategy_id)

    request.user.has_perm_to_change_or_die(strategy)

    POST = request.POST
    segment_desc_id = get_from_POST_or_404(POST, 'segment_desc_id', int)
    orga_id = get_from_POST_or_404(POST, 'orga_id', int)
    category = get_from_POST_or_404(POST, 'category', int)

    try:
        strategy.set_segment_category(segment_desc_id, orga_id, category)
    except Exception as e:
        raise Http404(str(e)) from e

    return HttpResponse()
Ejemplo n.º 25
0
 def perform_deletion(self, request):
     try:
         get_object_or_404(
             self.model,
             pk=get_from_POST_or_404(request.POST, self.id_arg),
         ).delete()
     except ProtectedError as e:
         raise ConflictError(e.args[0])
Ejemplo n.º 26
0
def delete_relation_type(request, graph_id):
    rtype_id = get_from_POST_or_404(request.POST, 'id')
    graph = get_object_or_404(Graph, pk=graph_id)

    request.user.has_perm_to_change_or_die(graph)
    graph.orbital_relation_types.remove(rtype_id)

    return HttpResponse()
Ejemplo n.º 27
0
 def get_email_ids(self, request):
     try:
         return [
             int(s) for s in get_from_POST_or_404(
                 request.POST, self.email_ids_arg).split(',') if s.strip()
         ]
     except ValueError as e:
         raise ConflictError(str(e)) from e
Ejemplo n.º 28
0
def delete(request):
    relation_type = get_object_or_404(RelationType, pk=get_from_POST_or_404(request.POST, 'id'))

    if not relation_type.is_custom:
        raise Http404("Can't delete a standard RelationType")

    relation_type.delete()

    return HttpResponse()
Ejemplo n.º 29
0
def delete(request):
    sci = get_object_or_404(SearchConfigItem, id=get_from_POST_or_404(request.POST, 'id'))

    if sci.is_default:
        raise ConflictError('You cannot delete the default configuration')

    sci.delete()

    return HttpResponse()
Ejemplo n.º 30
0
    def perform_deletion(self, request):
        relation_type = get_object_or_404(
            RelationType,
            pk=get_from_POST_or_404(request.POST, self.id_arg),
        )

        if not relation_type.is_custom:
            raise Http404("Can't delete a standard RelationType")

        relation_type.delete()