コード例 #1
0
class TicketUpdateUpdateSerializer(serializers.ModelSerializer):
    created_by = UserMinSerializer(read_only=True,
                                   default=serializers.CurrentUserDefault())
    created_at = serializers.ReadOnlyField()
    last_edited_by = UserMinSerializer(read_only=True)
    attachments = AttachmentSerializerDetail(many=True,
                                             required=False,
                                             read_only=True)

    class Meta:
        model = TicketUpdate
        fields = '__all__'
コード例 #2
0
 def get_users(self, request, pk):
     del request, pk  # unused
     client = self.get_object()
     return Response({
         'users':
         UserMinSerializer(instance=client.users, many=True).data
     })
コード例 #3
0
 def get_users_not_in_client(self, request, pk):
     del request, pk  # unused
     """Retrieve regular active users without any client associated to them"""
     self.get_object()  # Checks permissions
     users = get_user_model().objects.filter(is_active=True,
                                             is_staff=False,
                                             clients__isnull=True)
     return Response(
         {'users': UserMinSerializer(instance=users, many=True).data})
コード例 #4
0
class StaffOrderSerializer(serializers.ModelSerializer):
    # cart = StaffOrderItemSerializer(read_only=True, many=True)  #  NOTE(tomo): remove this field
    user = UserMinSerializer(read_only=True)
    client = ClientMinSerializer(read_only=True)
    invoice = StaffInvoiceBriefSerializer(read_only=True)
    fraud_check_result = serializers.JSONField(read_only=True)
    items = StaffOrderItemSerializer(read_only=True, many=True)
    total = serializers.DecimalField(read_only=True, decimal_places=2, max_digits=12)

    class Meta:
        model = Order
        fields = '__all__'
コード例 #5
0
class ResellerPublicKeySerializer(serializers.ModelSerializer):
    created_at = serializers.DateTimeField(read_only=True,
                                           default=CreateOnlyDefault(
                                               timezone.now))
    user = UserMinSerializer(read_only=True,
                             default=serializers.CurrentUserDefault())

    class Meta:
        model = PublicKey
        fields = ('id', 'name', 'public_key', 'created_at', 'fingerprint',
                  'user')
        read_only_fields = (
            'id',
            'fingerprint',
            'user',
        )
        validators = [
            UniqueTogetherValidator(
                queryset=PublicKey.objects.all(),
                fields=('name', 'user'),
                message=_('A key already exists with the same name'))
        ]

    def to_internal_value(self, data):
        data = super().to_internal_value(data)
        data['fingerprint'] = get_fingerprint(data['public_key'])
        return data

    @staticmethod
    def validate_public_key(value):
        if not is_valid_ssh_public_key(value):
            raise serializers.ValidationError(_('Invalid SSH public key'))
        return value

    @staticmethod
    def validate_name(value):
        # NOTE(tomo): OpenStack only allows "_- " digits and numbers
        safechars = "_- " + string.digits + string.ascii_letters
        clean_value = "".join(x for x in value if x in safechars)
        if clean_value != value:
            raise serializers.ValidationError(
                _("Name contains unsafe characters"))
        return value
コード例 #6
0
class ActivityLogSerializer(serializers.ModelSerializer):
    log = serializers.SerializerMethodField()
    type = serializers.SerializerMethodField()
    user = UserMinSerializer()
    tasks_count = serializers.SerializerMethodField()

    class Meta:
        model = Log
        fields = ('id', 'created_at', 'user', 'ip', 'type', 'parameters',
                  'log', 'tasks_count')
        read_only_fields = ('id', 'created_at', 'tasks_count')

    @staticmethod
    def get_tasks_count(instance: Log) -> bool:
        return instance.tasks.count()

    @staticmethod
    def get_log(instance):
        return smart_text(instance)

    @staticmethod
    def get_type(instance):
        return instance.log_class.type
コード例 #7
0
class TicketUpdateSerializer(serializers.ModelSerializer):
    attachments = AttachmentSerializerDetail(many=True,
                                             required=False,
                                             read_only=True)
    created_by = UserMinSerializer(read_only=True,
                                   default=serializers.CurrentUserDefault())
    created_by_display = serializers.SerializerMethodField(required=False,
                                                           read_only=True)
    new_status_display = serializers.SerializerMethodField(required=False,
                                                           read_only=True)
    new_status = serializers.CharField(required=False,
                                       read_only=True,
                                       allow_null=True,
                                       allow_blank=True)
    new_department_display = serializers.SerializerMethodField(required=False,
                                                               read_only=True)
    new_department = serializers.CharField(required=False,
                                           read_only=True,
                                           allow_null=True,
                                           allow_blank=True)
    created_at = serializers.ReadOnlyField()
    new_client = serializers.CharField(required=False,
                                       read_only=True,
                                       allow_null=True,
                                       allow_blank=True)
    new_client_display = serializers.SerializerMethodField(required=False,
                                                           read_only=True)
    last_edited_by = UserMinSerializer(read_only=True)
    new_cc = serializers.CharField(required=False,
                                   read_only=True,
                                   allow_null=True,
                                   allow_blank=True)
    email_generated = serializers.SerializerMethodField(required=False,
                                                        read_only=True)
    ticket_activity = serializers.SerializerMethodField(required=False,
                                                        read_only=True)
    update_owner_email = serializers.SerializerMethodField(required=False,
                                                           read_only=True)
    is_staff_generated = serializers.SerializerMethodField(required=False,
                                                           read_only=True)

    class Meta:
        model = TicketUpdate
        fields = (
            'id',
            'created_at',
            'created_by',
            'is_staff_generated',
            'created_by_display',
            'reply_text',
            'ticket_activity',
            'new_status',
            'new_status_display',
            'new_internal_status',
            'description_changed',
            'new_department',
            'new_department_display',
            'title_changed',
            'new_client',
            'new_client_display',
            'last_edited',
            'last_edited_by',
            'new_cc',
            'attachments',
            'email_generated',
            'update_owner_email',
        )

    @staticmethod
    def get_is_staff_generated(model: TicketUpdate):
        if model.created_by:
            return model.created_by.is_staff
        if model.email_message:
            user = AppUser.objects.filter(
                email=model.email_message.sender_address).first()
            if user:
                return user.is_staff
            return False
        return False

    @staticmethod
    def get_update_owner_email(model: TicketUpdate):
        if model.created_by:
            return model.created_by.email
        if model.email_message and not model.created_by:
            return model.email_message.sender_address
        return None

    @staticmethod
    def get_ticket_activity(model: TicketUpdate):
        if model.reply_text and (not model.new_status
                                 or not model.new_internal_status):
            return False
        return True

    @staticmethod
    def get_email_generated(model: TicketUpdate):
        return True if model.email_message is not None else False

    @staticmethod
    def get_created_by_display(model: TicketUpdate):
        if model.created_by:
            user = model.created_by
            return user.get_full_name() if user.get_full_name(
            ) else user.username
        elif model.email_message:
            return model.email_message.sender_address
        else:
            return _('N/A')

    @staticmethod
    def get_new_status_display(model: TicketUpdate):
        return TicketStatus.status_map.get(model.new_status, _('n/a'))

    @staticmethod
    def get_new_department_display(model: TicketUpdate):
        return str(model.new_department) if model.new_department else _('n/a')

    @staticmethod
    def get_new_client_display(model: TicketUpdate):
        return str(model.new_client) if model.new_client else _('n/a')
コード例 #8
0
class TicketSerializer(serializers.ModelSerializer):
    updates = TicketUpdateSerializer(many=True, required=False, read_only=True)
    department_display = serializers.SerializerMethodField(required=False,
                                                           read_only=True)
    status_display = serializers.SerializerMethodField(required=False,
                                                       read_only=True)
    client_display = serializers.SerializerMethodField(required=False,
                                                       read_only=True)
    description = serializers.CharField(max_length=10240,
                                        allow_null=True,
                                        allow_blank=True,
                                        required=False)
    created_at = serializers.ReadOnlyField()
    created_by = UserMinSerializer(read_only=True,
                                   default=serializers.CurrentUserDefault())
    department = serializers.PrimaryKeyRelatedField(
        queryset=Department.objects.all(), required=True, allow_null=False)
    assigned_to_display = serializers.SerializerMethodField(required=False,
                                                            read_only=True)
    assigned_to = serializers.PrimaryKeyRelatedField(read_only=True)
    associated_attachment_ids = serializers.CharField(write_only=True,
                                                      required=False,
                                                      allow_null=True)
    service = ClientFilteredServicesPrimaryKeyRelatedField(
        queryset=Service.objects, allow_null=True, required=False)
    main_attachments = serializers.SerializerMethodField(read_only=True,
                                                         required=False)
    created_by_email = serializers.SerializerMethodField(required=False,
                                                         read_only=True)
    ticket_owner_email = serializers.SerializerMethodField(required=False,
                                                           read_only=True)
    is_staff_generated = serializers.SerializerMethodField(required=False,
                                                           read_only=True)
    created_by_display = serializers.SerializerMethodField(required=False,
                                                           read_only=True)

    class Meta:
        model = Ticket
        fields = (
            'id',
            'created_at',
            'is_staff_generated',
            'created_by',
            'created_by_display',
            'client',
            'client_display',
            'title',
            'description',
            'department',
            'department_display',
            'status',
            'status_display',
            'updates',
            'cc_recipients',
            'assigned_to',
            'created_by_email',
            'ticket_owner_email',
            'assigned_to_display',
            'associated_attachment_ids',
            'main_attachments',
            'service',
        )

    @staticmethod
    def get_created_by_display(model: Ticket):
        if model.created_by:
            user = model.created_by  # type: AppUser
            return user.get_full_name() if user.get_full_name(
            ) else user.username
        elif model.email_message:
            return model.email_message.sender_address
        else:
            return _('n/a')

    @staticmethod
    def get_is_staff_generated(model: Ticket):
        if model.created_by:
            return model.created_by.is_staff
        if model.email_message:
            user = AppUser.objects.filter(
                email=model.email_message.sender_address).first()
            if user:
                return user.is_staff
            return False
        return False

    @staticmethod
    def get_main_attachments(model: Ticket):
        att = Attachment.objects.filter(ticket=model,
                                        ticket_update=None,
                                        ticket_note=None)
        if not att:
            return None
        return AttachmentBriefSerializer(instance=att,
                                         many=True,
                                         read_only=True).data

    @staticmethod
    def get_ticket_owner_email(model: Ticket):
        if model.created_by:
            return model.created_by.email
        if model.email_message and not model.created_by:
            return model.email_message.sender_address
        return None

    @staticmethod
    def get_created_by_email(model: Ticket):
        # returns None if the ticket was not generated from a received email
        return model.email_message.sender_address if model.email_message is not None else None

    @staticmethod
    def validate_status(status):
        if not status:
            return status
        if not TicketStatus.status_map.get(status, None):
            raise ValidationError(_('Invalid status.'))
        return status

    @staticmethod
    def validate_cc_recipients(recipients):
        if not recipients:
            return recipients
        if recipients[-1] == ',':
            raise ValidationError(detail=_('No email after the last comma'))
        email_regex = re.compile(r".+\@.+\..+")
        emails_list = recipients.split(',')
        for email in emails_list:
            if not email_regex.match(email):
                raise ValidationError(detail=_('Invalid list of emails'))
        return recipients

    @staticmethod
    def get_assigned_to_display(model: Ticket):
        if model.assigned_to:
            user = model.assigned_to
            return user.get_full_name() if user.get_full_name(
            ) else user.username
        else:
            return _('N/A')

    @staticmethod
    def get_client_display(model: Ticket):
        return str(model.client) if model.client else _('n/a')

    @staticmethod
    def get_department_display(model: Ticket):
        return str(model.department) if model.department else _('n/a')

    @staticmethod
    def get_status_display(model: Ticket):
        return TicketStatus.status_map.get(model.status, _('n/a'))
コード例 #9
0
 def get_users(user_group):
     qs = AppUser.objects.filter(user_groups=user_group)
     return UserMinSerializer(instance=qs, many=True).data