Ejemplo n.º 1
0
 def get_manual_fields(self, path, method):
     return [
         coreapi.Field('client_id',
                       required=True,
                       location='path',
                       schema=coreschema.Integer(description='Client ID')),
         coreapi.Field('product',
                       required=True,
                       location='form',
                       schema=coreschema.Integer(description='Product ID')),
         coreapi.Field('procedure_datetime',
                       required=True,
                       location='form',
                       schema=coreschema.String(
                           description='Procedure datetime in format '
                           'YYYY-MM-DD hh:mm:ss')),
         coreapi.Field(
             'cost_type',
             required=True,
             location='form',
             schema=coreschema.Integer(
                 description=f'Cost type: {UNIT_COST} for unit cost, '
                 f'{SYSTEM_COST} for system cost')),
         coreapi.Field(
             'discounts',
             required=False,
             location='form',
             schema=coreschema.Array(
                 description=f'Selected discounts, eg. "CCO, Repless"')),
         coreapi.Field('preference_questions',
                       required=True,
                       location='form',
                       schema=coreschema.Array(
                           description=f'Preference question IDs'))
     ]
Ejemplo n.º 2
0
    def get_serializer_fields(self, path, method):
        fields = []
        if method == 'POST':
            fields = [
                coreapi.Field(name="group_id",
                              required=True,
                              location="form",
                              schema=coreschema.Integer(
                                  title="group", description="Id группы"),
                              description='group_id'),
                coreapi.Field(
                    name="title",
                    required=True,
                    location="form",
                    schema=coreschema.String(title="title",
                                             description="Название задачи"),
                    description='Название задачи',
                ),
                coreapi.Field(
                    name="user",
                    required=True,
                    location="form",
                    schema=coreschema.Array(title="user",
                                            description="Юзеры в задаче"),
                    description='Юзеры в задаче',
                ),
            ]
        if method == 'PUT':
            fields = [
                coreapi.Field(name="done",
                              required=True,
                              location="form",
                              schema=coreschema.Boolean(
                                  title="done", description="Завершено"),
                              description='Завершено'),
                coreapi.Field(
                    name="title",
                    required=True,
                    location="form",
                    schema=coreschema.String(title="title",
                                             description="Название задачи"),
                    description='Название задачи',
                ),
                coreapi.Field(
                    name="user",
                    required=True,
                    location="form",
                    schema=coreschema.Array(title="user",
                                            description="Юзеры в задаче"),
                    description='Юзеры в задаче',
                ),
            ]

        return fields
Ejemplo n.º 3
0
def simple2schema(stype, description):
    if stype == "integer":
        return coreschema.Integer(description=description)
    if stype == "string":
        return coreschema.String(description=description)
    if stype == "array":
        return coreschema.Array(description=description)
Ejemplo n.º 4
0
class WebsiteReportFailure(viewsets.ViewSet):
    serializer_class = WebsiteReportingSerializer
    schema = AutoSchema(manual_fields=[
        coreapi.Field(
            "errors",
            location="body",
            schema=coreschema.Array(
                items=coreschema.Object(
                    properties={},
                    title="Error",
                )
            )
        ),
    ])

    @decorators.action(detail=True, methods=['post'])
    def report_failure(self, request, version, website_id=None):
        website: Website = Website.objects.filter(id=website_id).first()
        errors = request.data if isinstance(request.data, list) else []
        message = render_to_string('reporting_email.html', {'errors': errors, 'website': website})

        if not website.notification_sent_date \
                or website.notification_sent_date < timezone.now() - timedelta(seconds=website.notification_cooldown):
            website.notification_sent_date = datetime.now()
            website.save()
            send_mail(
                f'SeoSnap Reporting - {website.name}',
                message,
                os.getenv('ADMIN_EMAIL', '*****@*****.**'),
                [website.notification_email],
                fail_silently=False,
                html_message=message
            )

        return Response([])
Ejemplo n.º 5
0
class ActuatorAccess(APIView):
    """
    API endpoint that allows users actuator access to be viewed or edited.
    """
    permission_classes = (permissions.IsAdminUser, )

    schema = utils.OrcSchema(manual_fields=[
        coreapi.Field(
            "username",
            required=True,
            location="path",
            schema=coreschema.String(
                description='Username to list the accessible actuators'))
    ],
                             put_fields=[
                                 coreapi.Field("actuators",
                                               required=True,
                                               location="body",
                                               schema=coreschema.Array(
                                                   items=coreschema.String(),
                                                   min_items=1,
                                                   unique_items=True))
                             ])

    def get(self, request, username, *args, **kwargs):  # pylint: disable=unused-argument
        """
        API endpoint that lists the actuators a users can access
        """
        username = bleach.clean(username)
        rtn = [
            g.name for g in ActuatorGroup.objects.filter(
                users__in=[User.objects.get(username=username)])
        ]
        return Response(rtn)

    def put(self, request, username, *args, **kwargs):  # pylint: disable=unused-argument
        """
        API endpoint that adds actuators to a users access
        """
        username = bleach.clean(username)
        user = User.objects.get(username=username)
        if user is None:
            return ParseError(detail='User cannot be found', code=404)

        rtn = []
        for actuator in request.data.get('actuators', []):
            actuator = bleach.clean(actuator)

            group = Group.objects.exclude(actuatorgroup__isnull=True).filter(
                name=actuator).first()
            if group:
                rtn.append(group.name)
                user.groups.add(group)

        return Response(rtn)
Ejemplo n.º 6
0
    def get_serializer_fields(self,
                              path,
                              method,
                              view,
                              version=None,
                              method_func=None):
        """
        Return a list of `coreapi.Field` instances corresponding to any
        request body input, as determined by the serializer class.
        """
        if method in ('PUT', 'PATCH', 'POST'):
            location = 'form'
        else:
            location = 'query'

        serializer_class = self.get_serializer_class(view, method_func)
        if not serializer_class:
            return []

        serializer = serializer_class()
        if isinstance(serializer, serializers.ListSerializer):
            return [
                Field(name='data',
                      location=location,
                      required=True,
                      schema=coreschema.Array())
            ]

        if not isinstance(serializer, serializers.Serializer):
            return []

        fields = []
        for field in serializer.fields.values():
            if field.read_only or isinstance(field, serializers.HiddenField):
                continue

            required = field.required and method != 'PATCH'
            # if the attribute ('help_text') of this field is a lazy translation object, force it to generate a string
            description = str(field.help_text) if isinstance(
                field.help_text, Promise) else field.help_text
            fallback_schema = self.fallback_schema_from_field(field)
            field = Field(
                name=field.field_name,
                location=location,
                required=required,
                schema=fallback_schema
                if fallback_schema else field_to_schema(field),
                description=description,
            )
            fields.append(field)

        return fields
Ejemplo n.º 7
0
    def get_link(self, path, method, base_url):
        link = super_get_link(self, path, method, base_url)
        # link = super().get_link(path, method, base_url)
        method = method.lower()
        method_name = getattr(self.view, 'action', method.lower())
        link._responses = OrderedDict()
        # Add obvious responses based on common action names used in viewsets
        try:
            serializer_name = self.view.get_serializer().__class__.__name__
            if method_name in ('retrieve', 'update', 'partial_update'):
                response = coreschema.Response(
                    status=200,
                    schema=coreschema.Ref('%s_read' % serializer_name))
            elif method_name == 'list':
                response = coreschema.Response(
                    status=200,
                    schema=coreschema.Array(
                        items=coreschema.Ref('%s_read' % serializer_name)))
            elif method_name == 'create':
                response = coreschema.Response(
                    status=201,
                    schema=coreschema.Ref('%s_write' % serializer_name))
            elif method_name == 'destroy':
                response = coreschema.Response(status=204)
            else:
                response = None
            if response:
                link._responses[response.status] = response
        except (AttributeError, AssertionError):
            # not all views have get_serializer
            pass
        # User may want to add responses or overwrite existing
        try:
            # User defined responses come in a list
            for r in self.view.Meta.responses[method_name]:
                link._responses[r.status] = r
        except (AttributeError, KeyError):
            # The view doesn't have Meta, Meta doesn't have .responses or responses doesn't have this method
            pass

        # User may define what content types the view may produce:
        try:
            # User defined responses come in a list
            link._produces = self.view.Meta.produces[method_name]
        except (AttributeError, KeyError):
            # The view doesn't have Meta or Meta doesn't have .produces
            link._produces = []
        return link
Ejemplo n.º 8
0
class PageWebsiteUpdate(viewsets.ViewSet):
    schema = AutoSchema(manual_fields=[
        coreapi.Field("items",
                      location="body",
                      schema=coreschema.Array(items=coreschema.Object(
                          properties={},
                          title="Page",
                          description="Page",
                      ))),
    ])

    @decorators.action(detail=True, methods=['put'])
    def update_pages(self, request, version, website_id=None):
        website = Website.objects.filter(id=website_id).first()
        allowed = request.user.has_perm('seosnap.view_website', website)
        if not allowed or not website: return Response([])

        items = request.data if isinstance(request.data, list) else []
        addresses = [item['address'] for item in items if 'address' in item]

        existing = {
            page.address: page
            for page in Page.objects.filter(address__in=addresses,
                                            website_id=website_id)
        }
        allowed_fields = set(PageSerializer.Meta.fields) - set(
            PageSerializer.Meta.read_only_fields)
        for item in items:
            item = {k: item[k] for k in allowed_fields if k in item}
            if item['address'] in existing:
                page = existing[item['address']]
                for k, v in item.items():
                    setattr(page, k, v)
            else:
                existing[item['address']] = Page(**item)

        with transaction.atomic():
            cache_updated_at = website.cache_updated_at
            for page in existing.values():
                page.website_id = website_id
                cache_updated_at = page.cached_at
                page.save()
            website.cache_updated_at = cache_updated_at
            website.save()

        serializer = PageSerializer(list(existing.values()), many=True)
        return Response(serializer.data)
Ejemplo n.º 9
0
    def get_coreschema_field(self, field):
        description = six.text_type(field.extra.get('help_text', ''))

        if isinstance(field, filters.NumberFilter):
            return coreschema.Number(description=description)
        elif isinstance(field, filters.MultipleChoiceFilter):
            return coreschema.Array(
                items=coreschema.Enum(enum=[c[0]
                                            for c in field.field.choices]),
                description=description,
                unique_items=True,
            )
        elif isinstance(field, filters.ChoiceFilter):
            return coreschema.Enum(enum=[c[0] for c in field.field.choices],
                                   description=description)
        else:
            return coreschema.String(description=description)
Ejemplo n.º 10
0
    def get_schema(self):
        if self.dtype == str:
            return coreschema.String(description=self.description)

        elif self.dtype == bool:
            return coreschema.Boolean(description=self.description)

        elif self.dtype == int:
            return coreschema.Integer(description=self.description)
        elif self.dtype == float:
            return coreschema.Number(description=self.description)

        elif self.dtype == list:
            return coreschema.Array(description=self.description)

        else:
            raise TypeError("Parameter must have type.")
Ejemplo n.º 11
0
    def field_to_schema(self, field):
        import coreschema
        import django.forms as django_forms
        from django.utils.encoding import force_str
        title = force_str(field.label) if field.label else ''
        description = force_str(field.help_text) if field.help_text else ''

        schema = None

        if isinstance(field, django_forms.MultipleChoiceField):
            schema = coreschema.Array(
                items=coreschema.Enum(enum=list(field.choices)),
                title=title,
                description=description)
        elif isinstance(field, django_forms.ChoiceField) and not isinstance(
                field, django_forms.ModelChoiceField):
            choices = list(
                map(
                    lambda choice: choice[0]
                    if isinstance(choice, tuple) else choice, field.choices))
            choices.remove('')
            schema = coreschema.Enum(enum=choices,
                                     title=title,
                                     description=description)
        elif isinstance(field, django_forms.BooleanField):
            schema = coreschema.Boolean(title=title, description=description)
        elif isinstance(field,
                        (django_forms.DecimalField, django_forms.FloatField)):
            schema = coreschema.Number(title=title, description=description)
        elif isinstance(field, django_forms.IntegerField):
            schema = coreschema.Integer(title=title, description=description)
        elif isinstance(field, django_forms.DateField):
            schema = coreschema.String(title=title,
                                       description=description,
                                       format='date')
        elif isinstance(field, django_forms.DateTimeField):
            schema = coreschema.String(title=title,
                                       description=description,
                                       format='date-time')
        elif isinstance(field, django_forms.JSONField):
            schema = coreschema.Object(title=title, description=description)

        return schema or coreschema.String(title=title,
                                           description=description)
Ejemplo n.º 12
0
    def get_serializer_fields(self, path, method, view, version=None):
        """
        Return a list of `coreapi.Field` instances corresponding to any
        request body input, as determined by the serializer class.
        """
        if method not in ('PUT', 'PATCH', 'POST'):
            return []

        if not hasattr(view, 'serializer_class') and not hasattr(
                view, 'get_serializer_class'):
            return []

        serializer_class = view.get_serializer_class() if hasattr(view, 'get_serializer_class') \
            else view.serializer_class
        serializer = serializer_class()

        if isinstance(serializer, serializers.ListSerializer):
            return [
                Field(name='data',
                      location='body',
                      required=True,
                      schema=coreschema.Array())
            ]

        if not isinstance(serializer, serializers.Serializer):
            return []

        fields = []
        for field in serializer.fields.values():
            if field.read_only or isinstance(field, serializers.HiddenField):
                continue

            required = field.required and method != 'PATCH'
            field = Field(
                name=field.field_name,
                location='form',
                required=required,
                schema=field_to_schema(field),
                description=field.help_text,
            )
            fields.append(field)

        return fields
Ejemplo n.º 13
0
class DiceSequenceListByUUIDView(generics.ListAPIView):
    queryset = DiceSequence.objects.all()
    serializer_class = DiceSequenceListByUUIDSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)

    schema = AutoSchema(manual_fields=[
        coreapi.Field(
            "uuid_list",
            required=True,
            location="form",
            schema=coreschema.Array(
                description=""
            ),
        )
    ])

    def get(self, request, *args, **kwargs):
        try:
            uuid_list = request.data['uuid_list']
        except:
            content = { 'message': 'Missing required parameters', 'missing parameters': ['uuid_list'] }
            return Response(content, status=status.HTTP_400_BAD_REQUEST)

        uuid_list = [mod_uuid.UUID(entry) for entry in uuid_list]
        entries_found = self.get_queryset().filter(uuid__in=uuid_list)
        uuids_found = [entry.uuid for entry in entries_found]
        uuids_missing = [entry for entry in uuid_list if entry not in uuids_found]
        data = (
            DiceSequenceData(
                entry.uuid, entry.seq_name, entry.owner, [dice.sides for dice in entry.sequence.all()]
            )
            for entry in entries_found
        )
        
        if (uuid_list != []) and (len(uuids_missing) == len(uuid_list)):
            content = { 'message': 'Not Found', 'uuids_missing': uuids_missing }
            return Response(content, status=status.HTTP_404_NOT_FOUND)

        serializer = DiceSequenceSerializer(data, many=True, context={'request': request})

        content = { 'message': 'UUID Search Results', 'uuids_found': serializer.data, 'uuids_missing': uuids_missing }
        return Response(content)
Ejemplo n.º 14
0
    def get_link(self, path, method, base_url):
        link = super().get_link(path, method, base_url)
        # 无法指定bill_ids数组中的元素类型,这里元素定义为int但实际为str,无法处理...
        batch_del_fields = [
            Field('bill_ids',
                  location='form',
                  required=True,
                  schema=coreschema.Array(items=coreschema.Integer(),
                                          unique_items=True))
        ]
        fields = link.fields
        if link.url == '/api/v1/bills/batch/' and method.lower() == 'delete':
            fields = tuple(batch_del_fields)

        link = Link(url=link.url,
                    action=link.action,
                    encoding=link.encoding,
                    fields=fields,
                    description=link.description)
        document.Link()
        return link
Ejemplo n.º 15
0
def schema_view(request):
    schema = coreapi.Document(
        title='Occurrence Search API',
        content={
            'create':
            coreapi.Link(
                url='/api/occurrence/',
                action='get',
                fields=[
                    coreapi.Field(
                        name='urls',
                        required=True,
                        schema=coreschema.Array(),
                        description='Lista de sites iniciado com http ou https.'
                    ),
                    coreapi.Field(name='word',
                                  required=True,
                                  description='Palavra buscada.'),
                ],
                description='Count specific word occurrence on pages.')
        })
    # schema = generator.get_schema(request)
    return response.Response(schema)
Ejemplo n.º 16
0
class ReportView(object):
    """
    Updates and retrieves reports relations
    """
    def register():
        return [
            url(r'^reportManager/myReports/$', ReportView.myReports),
            url(r'^reportManager/sharedWithMe/$', ReportView.sharedWithMe),
            url(r'^reportManager/mySharedReports/$', ReportView.mySharedReports),
            url(r'^reportManager/$', ReportView.create),
            url(r'^reportManager/(?P<pk>\d+)/$', ReportView.update),
            url(r'^reportManager/getNavigator/$', ReportView.getNavigator),
            url(r'^reportManager/bulkDelete/$', ReportView.bulkDelete),
            url(r'^reportManager/changeOrder/$', ReportView.changeOrder),
            url(r'^reportManager/search/$', ReportView.search),
            url(r'^reportManager/duplicateItems/$', ReportView.duplicateItems),
            url(r'^reportManager/copyToMyReports/$', ReportView.copyToMyReports),
            url(r'^reportManager/setAsFav/$', ReportView.setAsFav),
            url(r'^reportManager/dropOnReport/$', ReportView.dropOnReport),
            url(r'^reportManager/exportItems/$', ReportView.exportItems),
            url(r'^reportManager/exportItemsAndPublish/$',
                ReportView.exportItemsAndPublish),
            url(r'^reportManager/importItems/$', ReportView.importItems),
            url(r'^reportManager/(?P<pk>\d+)/shares/$', ReportView.getShares),
            url(r'^reportManager/(?P<pk>\d+)/setShares/$', ReportView.setShares),
        ]

    @api_view(['GET'])
    @permission_required('pyplan.get_my_reports', raise_exception=True)
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("parent", required=False, location="query", description="Parent report"),
        coreapi.Field("favs", required=False, location="query", description="bool"),
    ]))
    def myReports(request, *args, **kargs):
        parent = request.query_params.get("parent", None)
        favs = bool(request.query_params.get("favs", None))

        service = ReportManagerService(request)
        result = service.myReports(parent, favs)

        return Response(ReportSerializer(result, many=True, context={'request': request}).data)

    @api_view(['GET'])
    @permission_required('pyplan.get_my_reports', raise_exception=True)
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("parent", required=False, location="query",
                      description="Parent report")
    ]))
    def sharedWithMe(request, *args, **kargs):
        parent = request.query_params.get("parent", None)

        service = ReportManagerService(request)
        response = service.sharedWithMe(parent)

        return Response(ReportSerializer(response, many=True, context={'request': request}).data)

    @api_view(['GET'])
    @permission_required('pyplan.get_my_reports', raise_exception=True)
    def mySharedReports(request, *args, **kargs):
        service = ReportManagerService(request)
        response = service.mySharedReports()

        return Response(ReportSerializer(response, many=True, context={'request': request}).data)

    @api_view(['POST'])
    @permission_required('pyplan.add_report', raise_exception=True)
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("parent", required=False, location="query",
                      description="Parent report")
    ]))
    def create(request, *args, **kargs):
        serializer = ReportCreateUpdateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        service = ReportManagerService(request)
        result = service.createReport(serializer.data)

        return Response(ReportSerializer(result, context={'request': request}).data)

    @api_view(['PUT', 'PATCH'])
    @permission_required('pyplan.change_report', raise_exception=True)
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("pk", required=False, location="query", description="ID")
    ]))
    def update(request, *args, **kargs):
        serializer = ReportCreateUpdateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        service = ReportManagerService(request)
        result = service.updateReport(int(kargs.get("pk")), serializer.data)
        if result:
            return Response(ReportSerializer(result, context={'request': request}).data)
        return Response(status=status.HTTP_404_NOT_FOUND)

    @api_view(['GET'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("report_id", required=False, location="query",),
        coreapi.Field("dashboard_id", required=False, location="query",)
    ]))
    def getNavigator(request, *args, **kargs):
        report_id = request.query_params.get("report_id", None)
        dashboard_id = request.query_params.get("dashboard_id", None)

        try:
            if not report_id and not dashboard_id:
                raise exceptions.NotAcceptable(
                    "Error in ReportView.getNavigator(): dashboard_id or report_id required, can't both be None")
            service = ReportManagerService(request)
            dashboard = service.getNavigator(report_id, dashboard_id)
            return Response(ReportGetNavigatorSerializer(dashboard).data)
        except Exception as ex:
            raise exceptions.NotAcceptable(
                f"Error in ReportView.getNavigator(): {str(ex)}")

    @api_view(['DELETE'])
    @permission_required('pyplan.delete_report', raise_exception=True)
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("values", required=True, location="body",),
    ]))
    def bulkDelete(request, *args, **kargs):
        ids = request.data.get("values", None)
        if ids is not None:
            service = ReportManagerService(request)
            result = service.bulkDelete(ids)
            return Response(ids)
        return Response(status=status.HTTP_400_BAD_REQUEST)

    @api_view(['PUT'])
    @permission_required('pyplan.organize_reports', raise_exception=True)
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("values", required=True, location="body",),
    ]))
    def changeOrder(request, *args, **kargs):
        ids = request.data.get("values", None)
        if ids is not None:
            service = ReportManagerService(request)
            result = service.changeOrder(ids)
            return Response(ids)
        return Response(status=status.HTTP_400_BAD_REQUEST)

    @api_view(['GET'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("text", required=True, description="Text to search"),
    ]))
    def search(request, *args, **kargs):
        text = str(request.query_params.get("text", ""))

        try:
            service = ReportManagerService(request)
            result = service.search(text)
            response = SearchResultSerializer(result)
            return Response(response.data)
        except Exception as ex:
            raise exceptions.NotAcceptable(ex)

    @api_view(['PUT'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("report_ids", required=True,
                      location="body", schema=coreschema.Array()),
        coreapi.Field("dashboard_ids", required=True,
                      location="body", schema=coreschema.Array()),
    ]))
    def duplicateItems(request, *args, **kargs):
        serializer = DuplicateItemsSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        service = ReportManagerService(request)
        result = service.duplicateItems(serializer.data)

        return Response(status=status.HTTP_200_OK)

    @api_view(['PUT'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("report_ids", required=True,
                      location="body", schema=coreschema.Array()),
        coreapi.Field("dashboard_ids", required=True,
                      location="body", schema=coreschema.Array()),
    ]))
    def copyToMyReports(request, *args, **kargs):
        serializer = DuplicateItemsSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        service = ReportManagerService(request)
        result = service.copyToMyReports(serializer.data)

        return Response(status=status.HTTP_200_OK)

    @api_view(['PUT'])
    @permission_required('pyplan.change_report', raise_exception=True)
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("report_ids", required=True,
                      location="body", schema=coreschema.Array()),
        coreapi.Field("dashboard_ids", required=True,
                      location="body", schema=coreschema.Array()),
    ]))
    def setAsFav(request, *args, **kargs):
        serializer = SetAsFavSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        service = ReportManagerService(request)
        result = service.setAsFav(serializer.data)

        return Response(SearchResultSerializer(result, context={'request': request}).data)

    @api_view(['PUT'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("report_ids", required=True,
                      location="body", schema=coreschema.Array()),
        coreapi.Field("dashboard_ids", required=True,
                      location="body", schema=coreschema.Array()),
        coreapi.Field("report_id", required=False,
                      location="query", description="Parent report ID"),
    ]))
    def dropOnReport(request, *args, **kargs):
        report_id = request.data.get("report_id", [])
        report_ids = request.data.get("report_ids", [])
        dashboard_ids = request.data.get("dashboard_ids", None)
        if report_ids or dashboard_ids:
            service = ReportManagerService(request)
            result = service.dropOnReport(report_ids, dashboard_ids, report_id)
            return Response(SearchResultSerializer(result, context={'request': request}).data)
        return Response(status=status.HTTP_400_BAD_REQUEST)

    @api_view(['PUT'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("report_ids", required=True,
                      location="body", schema=coreschema.Array()),
        coreapi.Field("dashboard_ids", required=True,
                      location="body", schema=coreschema.Array()),
    ]))
    def exportItems(request, *args, **kargs):
        serializer = DuplicateItemsSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        try:
            service = ReportManagerService(request)
            # 1. get data and file name
            data_to_export, file_name = service.exportItems(serializer.data)
            # 2. serialize data and convert to string
            json_string = dumps(ExportItemsSerializer(
                data_to_export).data, indent=None)
            # 3. make file stream from json string
            file_stream = FileManagerService().makeJsonStream(json_string)
            # 4. stream file as http response
            response = FileResponse(
                file_stream, as_attachment=True, filename=file_name)
            response['Content-Disposition'] = f'attachment; filename={file_name}'
            return response
        except Exception as ex:
            raise exceptions.NotAcceptable(detail=ex)

    @api_view(['PUT'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("username", required=True,
                      location="body", schema=coreschema.String),
        coreapi.Field("uuid", required=True,
                      location="body", schema=coreschema.String),
        coreapi.Field("model_folder", required=True,
                      location="body", schema=coreschema.String),
        coreapi.Field("model_id", required=True,
                      location="body", schema=coreschema.String),
        coreapi.Field("report_ids", required=True,
                      location="body", schema=coreschema.Array()),
        coreapi.Field("dashboard_ids", required=True,
                      location="body", schema=coreschema.Array())
    ]))
    def exportItemsAndPublish(request, *args, **kargs):
        serializer = ExportItemsAndPublishSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        try:
            service = ReportManagerService(request)
            external_link = service.exportItemsAndPublish(serializer.data)
            if external_link:
                return Response(external_link, status=status.HTTP_200_OK)
            return Response('There was an error publishing the item', status=status.HTTP_406_NOT_ACCEPTABLE)
        except Exception as ex:
            raise exceptions.NotAcceptable(detail=ex)

    @api_view(['PUT'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("reports", required=True, location="body",
                      schema=coreschema.Array()),
        coreapi.Field("dashboards", required=True,
                      location="body", schema=coreschema.Array()),
        coreapi.Field("styles", required=True, location="body",
                      schema=coreschema.Array()),
    ]))
    def importItems(request, *args, **kargs):
        serializer = ImportItemsSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        try:
            result = ReportManagerService(request).importItems(serializer.data)
            return Response(ExportItemsSerializer(result).data)
        except Exception as ex:
            raise exceptions.NotAcceptable(detail=ex)

    @api_view(['GET'])
    @permission_classes((IsAuthenticated,))
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("report_id", required=True, location="query",),
    ]))
    def getShares(request, *args, **kargs):
        report_id = int(kargs.get("pk"))
        if report_id:
            service = ReportManagerService(request)
            # TODO: return accessList
            try:
                result = service.getShares(report_id)
                return Response(ReportGetSharesSerializer(result).data)
            except ObjectDoesNotExist as ex:
                return Response({"message": str(ex)}, status=status.HTTP_404_NOT_FOUND)
            except Exception as ex:
                return Response({"message": str(ex)}, status=status.HTTP_400_BAD_REQUEST)
        return Response(status=status.HTTP_400_BAD_REQUEST)

    @api_view(['POST'])
    @permission_required('pyplan.change_report', raise_exception=True)
    @schema(AutoSchema(manual_fields=[
        coreapi.Field("report_id", required=True, location="query",),
    ]))
    def setShares(request, *args, **kargs):
        report_id = int(kargs.get("pk"))
        serializer = ReportSetSharesSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        if report_id:
            service = ReportManagerService(request)
            result = service.setShares(report_id, serializer.data)
            return Response(ReportGetSharesSerializer(result).data)
        return Response(status=status.HTTP_404_NOT_FOUND)
Ejemplo n.º 17
0
import coreschema
import re


jsonschema = coreschema.RefSpace({
    'Schema': coreschema.Object(
        properties={
            # Meta
            'id': coreschema.String(format='uri'),
            '$schema': coreschema.String(format='uri'),
            'title': coreschema.String(),
            'description': coreschema.String(),
            'default': coreschema.Anything(),
            'definitions': coreschema.Ref('SchemaMap'),
            # Type
            'type': coreschema.Ref('SimpleTypes') | coreschema.Array(items=coreschema.Ref('SimpleTypes'), min_items=1, unique_items=True),
            # Number validators
            'minimum': coreschema.Number(),
            'maximum': coreschema.Number(),
            'exclusiveMinimum': coreschema.Boolean(default=False),
            'exclusiveMaximum': coreschema.Boolean(default=False),
            'multipleOf': coreschema.Number(minimum=0, exclusive_minimum=True),
            # String validators
            'minLength': coreschema.Integer(minimum=0, default=0),
            'maxLength': coreschema.Integer(minimum=0),
            'pattern': coreschema.String(format='regex'),
            'format': coreschema.String(),
            # Array validators
            'items': coreschema.Ref('Schema') | coreschema.Ref('SchemaArray'), # TODO: default={}
            'additionalItems': coreschema.Boolean() | coreschema.Ref('Schema'),  # TODO: default={}
            'minItems': coreschema.Integer(minimum=0, default=0),
Ejemplo n.º 18
0
    def get_serializer_fields(self, path, method):
        fields = []
        if method == 'POST':
            fields = [
                coreapi.Field(name="group_id",
                              required=True,
                              location="form",
                              schema=coreschema.Integer(
                                  title="group", description="Id группы"),
                              description='group_id'),
                coreapi.Field(
                    name="title",
                    required=True,
                    location="form",
                    schema=coreschema.String(title="title",
                                             description="Название покупки"),
                    description='Название покупки',
                ),
                coreapi.Field(
                    name="price",
                    required=True,
                    location="form",
                    schema=coreschema.Number(title="price",
                                             description="Цена"),
                    description='Цена',
                ),
                coreapi.Field(
                    name="comment",
                    required=True,
                    location="form",
                    schema=coreschema.String(title="comment",
                                             description="Комментарий"),
                    description='Комментарий',
                ),
                coreapi.Field(
                    name="user",
                    required=True,
                    location="form",
                    schema=coreschema.Array(title="user",
                                            description="Юзеры в покупке"),
                    description='Юзеры в покупке',
                ),
            ]
        if method == 'PUT':
            fields = [
                coreapi.Field(name="done",
                              required=True,
                              location="form",
                              schema=coreschema.Boolean(
                                  title="done", description="Завершено"),
                              description='Завершено'),
                coreapi.Field(
                    name="title",
                    required=True,
                    location="form",
                    schema=coreschema.String(title="title",
                                             description="Название покупки"),
                    description='Название покупки',
                ),
                coreapi.Field(
                    name="price",
                    required=True,
                    location="form",
                    schema=coreschema.Number(title="price",
                                             description="Цена"),
                    description='Цена',
                ),
                coreapi.Field(
                    name="comment",
                    required=True,
                    location="form",
                    schema=coreschema.String(title="comment",
                                             description="Комментарий"),
                    description='Комментарий',
                ),
                coreapi.Field(
                    name="user",
                    required=True,
                    location="form",
                    schema=coreschema.Array(title="user",
                                            description="Юзеры в покупке"),
                    description='Юзеры в покупке',
                ),
            ]

        return fields
Ejemplo n.º 19
0
    def get_manual_fields(self, path, method):
        extra_fields = []

        if self._view.action == 'create':
            extra_fields = [
                coreapi.Field("host",
                              required=True,
                              location="form",
                              schema=coreschema.String(
                                  description='提交主机名,like: yum.ops.net')),
                coreapi.Field(
                    "interface",
                    required=True,
                    location="form",
                    schema=coreschema.String(
                        description=
                        '主机接口,like: [{"type":"1", "main":"1", "useip":"1", "ip":"10.0.99.1", "dns":"" ,"port":"10050"}] ',
                    )),
                coreapi.Field(
                    "templates",
                    required=True,
                    location="form",
                    schema=coreschema.String(
                        description='模板列表,like: ["10267", "10001"]', )),
            ]

        elif self._view.action == 'update':
            extra_fields = [
                coreapi.Field("host",
                              required=False,
                              location="form",
                              schema=coreschema.String(
                                  description='提交主机名,like: yum.ops.net', )),
                coreapi.Field(
                    "interfaces",
                    required=False,
                    location="form",
                    schema=coreschema.Array(
                        description=
                        '主机接口,like: [{"type":"1", "main":"1", "useip":"1", "ip":"10.0.33.1", "dns":"" ,"port":"10050"}]',
                    )),
                coreapi.Field("status",
                              required=False,
                              location="form",
                              schema=coreschema.String(
                                  description='主机监控状态,like: 0 启用, 1 停用', )),
            ]

        elif self._view.action == 'list':
            extra_fields = [
                coreapi.Field("hostid",
                              required=False,
                              location="query",
                              schema=coreschema.String(
                                  description='根据主机id查询,like: 10330', )),
                coreapi.Field("host",
                              required=False,
                              location="query",
                              schema=coreschema.String(
                                  description='根据主机名模糊查询,like: yum', )),
                coreapi.Field("available",
                              required=False,
                              location="query",
                              schema=coreschema.String(
                                  description='根据可用性查询主机[1 可用,0不可用],'
                                  'like: available=1', )),
                coreapi.Field("status",
                              required=False,
                              location="query",
                              schema=coreschema.String(
                                  description='根据启用状态查询主机[0 已启用,1 未启用],'
                                  'like: status=1', )),
                coreapi.Field("pageSize",
                              required=False,
                              location="query",
                              schema=coreschema.String(
                                  description='分页列表数量,like: 10', )),
                coreapi.Field("pageNo",
                              required=False,
                              location="query",
                              schema=coreschema.String(
                                  description='页序,like: 1', )),
                coreapi.Field("noPage",
                              required=False,
                              location="query",
                              schema=coreschema.String(
                                  description='不分页,like: 1', )),
            ]
        manual_fields = super().get_manual_fields(path, method)
        return manual_fields + extra_fields
Ejemplo n.º 20
0
class EditMovieView(CustomView):
    authentication_classes = (
        SessionAuthentication,
        TokenAuthentication,
    )
    permission_classes = (
        IsAuthenticated,
        IsAdminUser,
    )
    required_params = [
        'id', 'name', 'imdb_score', '99popularity', 'ratings', 'delete_genre',
        'add_genre', 'delete_movie_person', 'edit_person_role', 'add_person'
    ]
    schema = AutoSchema(manual_fields=[
        coreapi.Field(
            "id", required=True, location="form", schema=coreschema.Integer()),
        coreapi.Field(
            "name", required=True, location="form",
            schema=coreschema.String()),
        coreapi.Field("imdb_score",
                      required=True,
                      location="form",
                      schema=coreschema.Number()),
        coreapi.Field("99popularity",
                      required=True,
                      location="form",
                      schema=coreschema.Number()),
        coreapi.Field(
            "delete_movie_person",
            required=False,
            location="form",
            schema=coreschema.Array(),
            description="""[{'id':'abc','role':'actor'},...]""",
        ),
        coreapi.Field(
            "edit_person_role",
            required=False,
            location="form",
            schema=coreschema.Array(),
            description="""[{'name':'abc','prev_role':'actor'},...]""",
        ),
        coreapi.Field(
            "add_person",
            required=False,
            location="form",
            schema=coreschema.Array(coreschema.Array()),
            description="""[{'name':'abc','prev_role':'actor'},...]""",
        ),
        coreapi.Field(
            "delete_genre",
            required=True,
            location="form",
            schema=coreschema.Array(),
            description="['horror','Adventure']",
        ),
        coreapi.Field(
            "add_genre",
            required=True,
            location="form",
            schema=coreschema.Array(),
            description="['horror','Adventure']",
        ),
        coreapi.Field(
            "director",
            required=False,
            location="form",
            schema=coreschema.String(),
        ),
    ])

    def post(self, request, format=None):
        try:
            data = request.data
            movie = Movie.objects.get(id=data['id'])
            movie.name = data['name']
            movie.imdb_score = data['imdb_score']
            movie.popularity99 = data['99popularity']
            for tag in data["delete_genre"]:
                genre = Genre.objects.filter(name=tag)
                if genre:
                    genre = genre.first()
                    if genre in movie.genre.all():
                        movie.genre.remove(genre)

            for tag in data["add_genre"]:
                genre = Genre.objects.get_or_create(name=tag)[0]
                if genre not in movie.genre.all():
                    movie.genre.add(genre)
            for movieperson in data["delete_movie_person"]:
                if 'id' in movieperson.keys():
                    person = Person.objects.filter(id=int(movieperson["id"]))
                    if person:
                        person = person.first()
                        if 'role' in movieperson.keys():
                            role = MovieRole.objects.filter(
                                name=movieperson["role"])
                            if role:
                                role = role.first()
                                MoviePersonRoles.objects.filter(
                                    person=person, role=role,
                                    movie=movie).delete()
                        else:
                            MoviePersonRoles.objects.filter(
                                person=person, movie=movie).delete()
                else:
                    if 'name' in movieperson.keys():
                        person = Person.objects.filter(
                            name=movieperson["name"])
                        if person:
                            person = person.first()
                            if 'role' in movieperson.keys():
                                role = MovieRole.objects.filter(
                                    name=movieperson["role"])
                                if role:
                                    role = role.first()
                                    MoviePersonRoles.objects.filter(
                                        person=person, role=role,
                                        movie=movie).delete()
                            else:
                                MoviePersonRoles.objects.filter(
                                    person=person, movie=movie).delete()

            for movieperson in data['edit_person']:
                person = None
                if 'id' in movieperson.keys():
                    person = Person.objects.filter(id=int(movieperson['id']))
                    if person:
                        person.first()
                else:
                    if 'name' in movieperson.keys():
                        person = Person.objects.filter(
                            name=movieperson['name'])
                        if person:
                            person.first()
                if person:
                    if 'prev_role' in movieperson.keys():
                        prev_role = MovieRole.objects.filter(
                            name=movieperson["prev_role"])
                        if prev_role:
                            prev_role = prev_role.first()
                            if 'new_role' in movieperson.keys():
                                new_role = MovieRole.objects.get_or_create(
                                    name=movieperson['new_role'])[0]
                                moviepersonrole = MoviePersonRoles.objects.filter(
                                    movie=movie, person=person, role=prev_role)
                                if moviepersonrole and not MoviePersonRoles.objects.filter(
                                        movie=movie, person=person,
                                        role=new_role).exists():
                                    moviepersonrole = moviepersonrole.first()
                                    moviepersonrole.role = new_role
                                    moviepersonrole.save()

            for movieperson in data['add_person']:
                person = None
                if 'id' in movieperson.keys():
                    person = Person.objects.filter(id=int(movieperson['id']))
                    if person:
                        person.first()
                else:
                    if 'name' in movieperson.keys():
                        person = Person.objects.filter(
                            name=movieperson['name'])
                        if person:
                            person.first()
                if 'role' in movieperson.keys():
                    role = MovieRole.objects.get_or_create(
                        name=movieperson['role'])[0]
                    if not MoviePersonRoles.objects.filter(
                            movie=movie, person=person, role=role).exists():
                        MoviePersonRoles(movie=movie, person=person,
                                         role=role).save()

            movie.save()
            return Response({'message': 'success'})
        except Exception as e:
            return Response({"error": str(e)},
                            status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 21
0
                  schema=coreschema.String()),
    coreapi.Field(name='product_name',
                  required=True,
                  location="form",
                  schema=coreschema.String()),
    coreapi.Field('unit_price',
                  required=True,
                  location="form",
                  schema=coreschema.Integer()),
    coreapi.Field(
        'amount', required=False, location="form",
        schema=coreschema.Integer()),
    coreapi.Field('product_attr',
                  required=False,
                  location='form',
                  schema=coreschema.Array())
])

UpdateProductSchema = ManualSchema(fields=[
    coreapi.Field(name='product_stock_name',
                  required=True,
                  location="form",
                  schema=coreschema.String()),
    coreapi.Field(name='name',
                  required=True,
                  location="form",
                  schema=coreschema.String()),
    coreapi.Field('unit_price',
                  required=True,
                  location="form",
                  schema=coreschema.Integer()),
Ejemplo n.º 22
0
        coreapi.Field(name='booking_id',
                      required=True,
                      location='path',
                      schema=coreschema.Integer(
                          description='Identifier of the booking')),
        coreapi.Field(
            name='token',
            required=True,
            location='form',
            schema=coreschema.String(
                description=
                'Temporary authorization token assigned during booking')),
        coreapi.Field(name='tickets',
                      required=True,
                      location='form',
                      schema=coreschema.Array(
                          description='Array with ticket data\'s', ))
    ]))
@permission_classes(())
@authentication_classes(())
def replace_tickets(request, booking_id, format=None):
    """
        Removes old and creates new tickets for specified booking
    """
    try:
        booking = Booking.objects.get(pk=booking_id)
        check_booking_token(booking, request.data.get('token'))
        tickets = request.data.get('tickets', [])
        for ticket in tickets:
            ticket['booking'] = booking_id
        serializer = TicketSerializer(data=tickets, many=True)
        with transaction.atomic():
Ejemplo n.º 23
0
 coreschema.String(format="uri"),
 "$schema":
 coreschema.String(format="uri"),
 "title":
 coreschema.String(),
 "description":
 coreschema.String(),
 "default":
 coreschema.Anything(),
 "definitions":
 coreschema.Ref("SchemaMap"),
 # Type
 "type":
 coreschema.Ref("SimpleTypes")
 | coreschema.Array(items=coreschema.Ref("SimpleTypes"),
                    min_items=1,
                    unique_items=True),
 # Number validators
 "minimum":
 coreschema.Number(),
 "maximum":
 coreschema.Number(),
 "exclusiveMinimum":
 coreschema.Boolean(default=False),
 "exclusiveMaximum":
 coreschema.Boolean(default=False),
 "multipleOf":
 coreschema.Number(minimum=0, exclusive_minimum=True),
 # String validators
 "minLength":
 coreschema.Integer(minimum=0, default=0),
Ejemplo n.º 24
0
class FileManagerView(object):
    """
    FileManager View.

    * Requires token authentication.
    * Only authenticated users are able to access this view.
    """
    @staticmethod
    def register():
        return [
            url(r'^fileManager/getMainFolders/$',
                FileManagerView.getMainFolders),
            url(r'^fileManager/getFiles/$',
                FileManagerView.getFoldersAndFiles),
            url(r'^fileManager/createFolder/$', FileManagerView.createFolder),
            url(r'^fileManager/copyFileOrFolder/$',
                FileManagerView.copyFileOrFolder),
            url(r'^fileManager/renameFile/$', FileManagerView.renameFile),
            url(r'^fileManager/duplicateFiles/$',
                FileManagerView.duplicateFiles),
            url(r'^fileManager/moveFiles/$', FileManagerView.moveFiles),
            url(r'^fileManager/copyFiles/$', FileManagerView.copyFiles),
            url(r'^fileManager/copyToMyWorkspace/$',
                FileManagerView.copyToMyWorkspace),
            url(r'^fileManager/deleteFiles/$', FileManagerView.deleteFiles),
            url(r'^fileManager/upload/$', FileManagerView.upload),
            url(r'^fileManager/download/$', FileManagerView.download),
            url(r'^fileManager/unzipFile/$', FileManagerView.unzipFile),
            url(r'^fileManager/zipFiles/$', FileManagerView.zipFiles),
            url(r'^fileManager/getHome/', FileManagerView.getHome),
            url(r'^fileManager/optimizeTemplates/$',
                FileManagerView.optimizeTemplates),
        ]

    @staticmethod
    @api_view(['GET'])
    @permission_required('pyplan.list_folders', raise_exception=True)
    def getMainFolders(request, *args, **kargs):
        """
        list:
        Return a list of all folders.
        """
        try:
            service = FileManagerService(request)
            folders = service.getMainFolders()
            serializer = FileEntrySerializer(
                folders,
                many=True,
                context={'client_session': service.client_session})
            return Response(serializer.data)
        except FileNotFoundError:
            raise exceptions.NotFound('Folder Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['GET'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field('folder',
                          required=False,
                          location='query',
                          description='folder name'),
        ]))
    @permission_required('pyplan.list_folders', raise_exception=True)
    def getFoldersAndFiles(request, *args, **kargs):
        """
        list:
        Return a list of all folders and files.
        """
        serializer = GetFoldersAndFilesSerializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        folder = request.query_params.get('folder', '')
        try:
            service = FileManagerService(request)
            files = service.getFoldersAndFiles(folder)
            serializer = FileEntrySerializer(
                files,
                many=True,
                context={'client_session': service.client_session})
            return Response(serializer.data)
        except FileNotFoundError:
            raise exceptions.NotFound('Folder Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['POST'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("data",
                          required=True,
                          location="body",
                          description='{"folder_path":str, "folder_name":str}',
                          schema=coreschema.Object()),
        ]))
    @permission_required('pyplan.add_folder', raise_exception=True)
    def createFolder(request, *args, **kargs):
        """
        create:
        Creates a folder inside provided path.
        """
        serializer = CreateFolderSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        try:
            folder_path = serializer['folder_path'].value
            folder_name = serializer['folder_name'].value

            path = FileManagerService().createFolder(folder_path, folder_name)
            return Response({'path': path})
        except FileNotFoundError:
            raise exceptions.NotFound('Folder Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['POST'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("data",
                          required=True,
                          location="body",
                          description='{"folder_path":str, "folder_name":str}',
                          schema=coreschema.Object()),
        ]))
    @permission_required('pyplan.copy_file_or_folder', raise_exception=True)
    def copyFileOrFolder(request, *args, **kargs):
        """
        create:
        Duplicate file or Folder.
        """
        serializer = CopyFileOrFolderSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        try:
            source = serializer['source'].value
            destination = serializer['destination'].value
            result = FileManagerService().copyFileOrFolder(source, destination)

            return Response({'path': result})
        except FileNotFoundError:
            raise exceptions.NotFound('Folder Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['GET'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("source", required=True, location="query"),
            coreapi.Field("newName", required=True, location="query"),
        ]))
    @permission_required('pyplan.copy_file_or_folder', raise_exception=True)
    def renameFile(request, *args, **kargs):
        """
        Rename File
        """
        source = request.query_params.get('source', None)
        new_name = request.query_params.get('newName', None)

        try:
            result = FileManagerService().renameFile(source, new_name)
            return Response({'path': result})
        except FileNotFoundError:
            raise exceptions.NotFound('Folder or File Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['GET'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("sources", required=True, location="query"),
        ]))
    @permission_required('pyplan.copy_file_or_folder', raise_exception=True)
    def duplicateFiles(request, *args, **kargs):
        """
        Duplicate Files
        """
        sources = request.query_params.getlist('sources', [])

        try:
            if len(sources) > 0:
                result = FileManagerService().duplicateFiles(sources)
                return Response({'path': result})
            return Response(status=status.HTTP_204_NO_CONTENT)
        except FileNotFoundError:
            raise exceptions.NotFound('Folder or File Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['GET'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("sources", required=True, location="query"),
            coreapi.Field("target", required=True, location="query"),
        ]))
    @permission_required('pyplan.copy_file_or_folder', raise_exception=True)
    def moveFiles(request, *args, **kargs):
        """
        Move Files
        """
        sources = request.query_params.getlist('sources', [])
        target = request.query_params.get('target', None)

        try:
            if len(sources) > 0 and target:
                result = FileManagerService().moveFiles(sources, target)
                return Response()
            return Response(status=status.HTTP_204_NO_CONTENT)
        except FileNotFoundError:
            raise exceptions.NotFound('Folder or File Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['GET'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("sources", required=True, location="query"),
            coreapi.Field("target", required=True, location="query"),
        ]))
    @permission_required('pyplan.copy_file_or_folder', raise_exception=True)
    def copyFiles(request, *args, **kargs):
        """
        Copy Files
        """
        sources = request.query_params.getlist('sources', [])
        target = request.query_params.get('target', None)

        try:
            if len(sources) > 0 and target:
                result = FileManagerService().copyFiles(sources, target)
                return Response()
            return Response(status=status.HTTP_204_NO_CONTENT)
        except FileNotFoundError:
            raise exceptions.NotFound('Folder or File Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['GET'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("source", required=True, location="query"),
        ]))
    @permission_required('pyplan.copy_file_or_folder', raise_exception=True)
    def copyToMyWorkspace(request, *args, **kargs):
        """
        Copy to My Workspace
        """
        source = request.query_params.get('source', None)

        try:
            if source:
                result = FileManagerService(request).copyToMyWorkspace(source)
                return Response(result)
            return Response(status=status.HTTP_204_NO_CONTENT)
        except FileNotFoundError:
            raise exceptions.NotFound('Folder or File Not Found')
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['DELETE'])
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("sources", required=True, location="query"),
        ]))
    @permission_required('pyplan.delete_files', raise_exception=True)
    def deleteFiles(request, *args, **kargs):
        """
        create:
        Duplicate file or Folder.
        """
        serializer = DeleteFilesSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        try:
            sources = serializer['sources'].value
            result = FileManagerService().deleteFiles(sources)

            return Response(status=status.HTTP_200_OK)
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['POST'])
    @permission_classes((permissions.IsAuthenticated, ))
    @parser_classes((
        parsers.MultiPartParser,
        parsers.FormParser,
    ))
    def upload(request, *args, **kargs):
        """
        uploads multiple files
        """
        serializer = UploadFilesSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        try:
            service = FileManagerService(request)
            service.createFile(request.FILES["files"],
                               serializer.data.get("folder_path"),
                               serializer.data.get("name"),
                               serializer.data.get("chunk"))
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)
        return Response(status=status.HTTP_200_OK)

    @staticmethod
    @api_view(['GET'])
    @authentication_classes((QueryStringTokenAuthentication, ))
    @permission_required('pyplan.download_files', raise_exception=True)
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("sources",
                          required=True,
                          location="query",
                          schema=coreschema.Array()),
            coreapi.Field("auth_token",
                          required=True,
                          location="query",
                          schema=coreschema.String()),
        ]))
    def download(request, *args, **kargs):
        """
        download multiple files
        """
        serializer = SourcesListSerializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        try:
            service = FileManagerService(request)
            file_stream, file_name = service.download(
                serializer.data.get('sources'), )
            return FileResponse(file_stream,
                                as_attachment=True,
                                filename=file_name)
        except Exception as ex:
            raise exceptions.NotAcceptable(detail=ex)

    @staticmethod
    @api_view(['GET'])
    @permission_classes((permissions.IsAuthenticated, ))
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("source", required=True, location="query"),
            coreapi.Field("targetFolder", required=True, location="query"),
        ]))
    def unzipFile(request, *args, **kargs):
        """
        unzip file
        """
        serializer = UnzipFileSerializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        try:
            service = FileManagerService(request)
            service.unzipFile(serializer.data.get("source"),
                              serializer.data.get("targetFolder"))
            return Response(status=status.HTTP_200_OK)
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['GET'])
    @permission_classes((permissions.IsAuthenticated, ))
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("sources",
                          required=True,
                          location="query",
                          schema=coreschema.Array()),
        ]))
    def zipFiles(request, *args, **kargs):
        """
        zip files
        """
        serializer = SourcesListSerializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        try:
            service = FileManagerService(request)
            response = service.zipFiles(serializer.data.get("sources"))
            return Response(response, status=status.HTTP_200_OK)
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)

    @staticmethod
    @api_view(['GET'])
    @permission_classes((permissions.IsAuthenticated, ))
    def getHome(request, *args, **kargs):
        """
        Return home json definition of the current company
        """
        service = FileManagerService(request)
        return Response(service.getHome())

    @staticmethod
    @api_view(['GET'])
    @permission_classes((permissions.IsAuthenticated, ))
    @schema(
        AutoSchema(manual_fields=[
            coreapi.Field("sources",
                          required=True,
                          location="query",
                          schema=coreschema.Array()),
        ]))
    def optimizeTemplates(request, *args, **kargs):
        """
        Optimice templates for speed up future reads
        """
        serializer = SourcesListSerializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        try:
            service = FileManagerService(request)
            service.optimizeTemplates(serializer.data.get("sources"), )
        except Exception as ex:
            return Response(str(ex), status=status.HTTP_400_BAD_REQUEST)
        return Response(status=status.HTTP_200_OK)
Ejemplo n.º 25
0
class AddMovieView(CustomView):
    authentication_classes = (
        SessionAuthentication,
        TokenAuthentication,
    )
    permission_classes = (
        IsAuthenticated,
        IsAdminUser,
    )
    required_params = ['name', 'imdb_score', '99popularity', 'people', 'genre']
    schema = AutoSchema(manual_fields=[
        coreapi.Field(
            "name", required=True, location="form",
            schema=coreschema.String()),
        coreapi.Field("imdb_score",
                      required=True,
                      location="form",
                      schema=coreschema.Number()),
        coreapi.Field("99popularity",
                      required=True,
                      location="form",
                      schema=coreschema.Number()),
        coreapi.Field(
            "people",
            required=False,
            location="form",
            schema=coreschema.Array(),
            description="""[{'name':'abc','role':'actor'},...]""",
        ),
        coreapi.Field(
            "genre",
            required=True,
            location="form",
            schema=coreschema.Array(),
            description="['horror','Adventure']",
        ),
        coreapi.Field(
            "director",
            required=False,
            location="form",
            schema=coreschema.String(),
        ),
    ])

    def post(self, request, format=None):
        data = request.data
        try:
            movie = Movie(name=data["name"],
                          imdb_score=data["imdb_score"],
                          popularity99=data['99popularity'])
            movie.save()
            if "director" in data:
                role = MovieRole.objects.get_or_create(name="director")[0]
                person_temp = Person.objects.get_or_create(
                    name=data["director"])[0]
                mov_p_roles = MoviePersonRoles(person=person_temp,
                                               movie=movie,
                                               role=role)
                mov_p_roles.save()
            for person in data["people"]:
                role = MovieRole.objects.get_or_create(name=person["role"])[0]
                person_temp = Person.objects.get_or_create(
                    name=person["name"])[0]
                mov_p_roles = MoviePersonRoles(person=person_temp,
                                               movie=movie,
                                               role=role)
                mov_p_roles.save()
            for tag in data["genre"]:
                genre = Genre.objects.get_or_create(name=tag)[0]
                movie.genre.add(genre)
            movie.save()
            return Response({'movie_id': movie.pk})
        except Exception as e:
            return Response({"error": str(e)},
                            status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 26
0
class CustomJsonSchema(schemas.AutoSchema):

    def get_manual_fields(self, path, method):
        return self._manual_fields + get_fields(method, json_fields)


json_fields = {
    'POST': [
        coreapi.Field(
            'type',
            required=False,
            location='form',
            type='integer',
            schema=coreschema.Array(
                description='Type of log',
            ),
        ),
        coreapi.Field(
            'new',
            required=False,
            location='form',
            type='boolean',
            schema=coreschema.Array(
                description='Force creation of new log'
            )
        ),
        coreapi.Field(
            'json',
            required=True,
            location='form',