Example #1
0
class InventoryAccountRowSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    voucher_no = serializers.ReadOnlyField(source='creator.get_voucher_no')
    income_quantity = serializers.SerializerMethodField()
    income_rate = serializers.SerializerMethodField()
    expense_quantity = serializers.SerializerMethodField()
    current_balance = serializers.SerializerMethodField()
    date = serializers.DateField(format=None)

    class Meta:
        model = JournalEntry

    def get_income_quantity(self, obj):
        if obj.creator.__class__.__name__ == 'SaleRow':
            return ''
        else:
            default_unit = self.context.get('default_unit')
            if obj.creator.unit.name != default_unit:
                unit_conversion = UnitConversion.objects.get(
                    base_unit__name=default_unit,
                    unit_to_convert__name=obj.creator.unit.name)
                multiple = unit_conversion.multiple
                if self.context.get('unit_multiple'):
                    unit_multiple = self.context.get('unit_multiple')
                    return (obj.creator.quantity * multiple) / unit_multiple
                else:
                    return obj.creator.quantity * multiple
            else:
                if self.context.get('unit_multiple'):
                    unit_multiple = self.context.get('unit_multiple')
                    return obj.creator.quantity / unit_multiple
                else:
                    return obj.creator.quantity

    def get_income_rate(self, obj):
        if obj.creator.__class__.__name__ == 'SaleRow':
            return ''
        else:
            default_unit = self.context.get('default_unit')
            if obj.creator.unit.name != default_unit:
                unit_conversion = UnitConversion.objects.get(
                    base_unit__name=default_unit,
                    unit_to_convert__name=obj.creator.unit.name)
                multiple = unit_conversion.multiple
                if self.context.get('unit_multiple'):
                    unit_multiple = self.context.get('unit_multiple')
                    return (obj.creator.rate * unit_multiple) / multiple
                else:
                    return obj.creator.rate / multiple
            else:
                if self.context.get('unit_multiple'):
                    unit_multiple = self.context.get('unit_multiple')
                    return obj.creator.rate * unit_multiple
                else:
                    return obj.creator.rate

    def get_expense_quantity(self, obj):
        if obj.creator.__class__.__name__ == 'PurchaseVoucherRow':
            return ''
        else:
            default_unit = self.context.get('default_unit')
            if obj.creator.unit.name != default_unit:
                unit_conversion = UnitConversion.objects.get(
                    base_unit__name=default_unit,
                    unit_to_convert__name=obj.creator.unit.name)
                multiple = unit_conversion.multiple
                if self.context.get('unit_multiple'):
                    unit_multiple = self.context.get('unit_multiple')
                    return (obj.creator.quantity * multiple) / unit_multiple
                else:
                    return obj.creator.quantity * multiple
            else:
                if self.context.get('unit_multiple'):
                    unit_multiple = self.context.get('unit_multiple')
                    return obj.creator.quantity / unit_multiple
                else:
                    return obj.creator.quantity

    def get_expense_rate(self, obj):
        if obj.creator.__class__.__name__ == 'PurchaseVoucherRow':
            return ''
        return obj.creator.rate

    def get_current_balance(self, obj):
        return obj.transactions.filter(
            account=obj.creator.item.account)[0].current_balance
Example #2
0
class GameSerializer(serializers.Serializer):
    url = serializers.ReadOnlyField(source="get_absolute_url")
Example #3
0
class UserSerializer(serializers.ModelSerializer):

    name = serializers.ReadOnlyField()
    practice_names = serializers.SerializerMethodField()
    active_practice_name = serializers.SerializerMethodField()
    active_theme_name = serializers.SerializerMethodField()
    active_rp_name = serializers.ReadOnlyField()
    AFSL = AFSLSerializer(many=False, required=False, allow_null=True)
    # multiple_rpgs = serializers.SerializerMethodField()

    class Meta:
        model = User
        exclude = ["password", "date_joined", "last_login"]


    def update(self, instance, validated_data):
        '''
        Modified to allow updating of AFSL number via the user serializer.
        '''
        AFSL_data = validated_data.pop('AFSL')

        if AFSL_data:
            if instance.AFSL:
                if getattr(instance.AFSL,"AFSL_number","") != AFSL_data["AFSL_number"]:
                    # AFSL number has  changed
                    validated_data = create_or_link_AFSL(AFSL_data, validated_data)
                    send_verification_email(instance, AFSL_data)
                else:
                    # AFSL number has not changed, no action required.
                    pass

            else:
                # No AFSL currently linked, set up a new link and send email
                validated_data = create_or_link_AFSL(AFSL_data, validated_data)
                send_verification_email(instance, AFSL_data)

        user = super().update(instance, validated_data)

        return user




    def get_practice_names(self, obj):
        result = []
        if obj.practices.all():
            for practice in obj.practices.all():
                print(practice)
                result.append(practice.name);
                return result
        else:
            return None

    def get_active_practice_name(self,obj):

        if obj.active_practice:
            try:
                practice = get_object_or_404(Practice, id=obj.active_practice.id)
                return practice.name

            except Exception as e:
                print(e)

    def get_active_theme_name(self,obj):

        if obj.active_theme:
            try:
                theme = get_object_or_404(Theme, id=obj.active_theme.id)
                return theme.name

            except Exception as e:
                print(e)
Example #4
0
class Doc2RelateSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()
    class Meta:
        model = Doc2Relate
        fields = '__all__'
 class TestSerializer(serializers.ModelSerializer):
     missing = serializers.ReadOnlyField()
Example #6
0
class MeetingtypeSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()
    class Meta:
        model = Meetingtype
        fields = '__all__'
Example #7
0
class BiaoDanSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()
    class Meta:
        model = BiaoDan
        fields = '__all__'
Example #8
0
class InterventionResultLinkVisitSerializer(serializers.ModelSerializer):
    name = serializers.ReadOnlyField(source="cp_output.name")

    class Meta:
        model = InterventionResultLink
        fields = ['id', 'name']
Example #9
0
class EmployeeEmployeeRoleSerializer(serializers.HyperlinkedModelSerializer):
    role = serializers.ReadOnlyField()

    class Meta:
        model = EmployeesEmployeeRoles
        fields = ('employee_id', 'role_id', 'role')
Example #10
0
class InterfaceNestedSerializer(InterfaceSerializer):
    form_factor = serializers.ReadOnlyField(source='get_form_factor_display')

    class Meta(InterfaceSerializer.Meta):
        fields = ['id', 'device', 'name']
Example #11
0
class TPMVisitLightSerializer(StatusPermissionsBasedRootSerializerMixin,
                              WritableNestedSerializerMixin,
                              serializers.ModelSerializer):
    tpm_partner = SeparatedReadWriteField(read_field=TPMPartnerLightSerializer(
        label=_('TPM Partner'), read_only=True), )

    offices = SeparatedReadWriteField(read_field=OfficeSerializer(
        read_only=True,
        many=True,
        label=_('Office(s) of UNICEF Focal Point(s)')), )

    unicef_focal_points = SeparatedReadWriteField(
        read_field=MinimalUserSerializer(read_only=True,
                                         many=True,
                                         label=_('UNICEF Focal Points')), )

    tpm_partner_focal_points = SeparatedReadWriteField(
        read_field=TPMPartnerStaffMemberSerializer(
            read_only=True, many=True, label=_('TPM Focal Points')), )

    status_date = serializers.ReadOnlyField(label=_('Status Date'))

    implementing_partners = serializers.SerializerMethodField(
        label=_('Implementing Partners'))
    locations = serializers.SerializerMethodField(label=_('Locations'))
    sections = serializers.SerializerMethodField(label=_('Sections'))

    def get_implementing_partners(self, obj):
        return MinimalPartnerOrganizationListSerializer(set(
            map(lambda a: a.partner, obj.tpm_activities.all())),
                                                        many=True).data

    def get_locations(self, obj):
        return LocationLightSerializer(set(
            itertools.chain(
                *map(lambda a: a.locations.all(), obj.tpm_activities.all()))),
                                       many=True).data

    def get_sections(self, obj):
        return SectorSerializer(set(
            map(lambda a: a.section, obj.tpm_activities.all())),
                                many=True).data

    class Meta(StatusPermissionsBasedRootSerializerMixin.Meta,
               WritableNestedSerializerMixin.Meta):
        model = TPMVisit
        permission_class = TPMPermission
        fields = [
            'id',
            'start_date',
            'end_date',
            'tpm_partner',
            'implementing_partners',
            'locations',
            'sections',
            'status',
            'status_date',
            'reference_number',
            'offices',
            'tpm_partner_focal_points',
            'unicef_focal_points',
            'date_created',
            'date_of_assigned',
            'date_of_tpm_accepted',
            'date_of_tpm_rejected',
            'date_of_tpm_reported',
            'date_of_unicef_approved',
            'date_of_tpm_report_rejected',
            'date_of_cancelled',
        ]
        extra_kwargs = {
            'reference_number': {
                'label': _('Reference Number'),
            },
        }
Example #12
0
class UserPrivateSerializer(UserPublicSerializer):
    token = serializers.ReadOnlyField(source='auth_token.key')

    class Meta:
        model = models.User
        fields = UserPublicSerializer.Meta.fields + ('token',)
Example #13
0
class UserPublicSerializer(serializers.ModelSerializer):
    mode = serializers.ReadOnlyField()

    class Meta:
        model = models.User
        fields = ('email', 'phone', 'birth', )
Example #14
0
class PostSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='user.username')
    class Meta:
        model = Post
        fields = ('id', 'created_date', 'post_details', 'status',"owner")
Example #15
0
class PageSerializer(DispatchModelSerializer, DispatchPublishableSerializer):
    """Serializes the Page model."""

    id = serializers.ReadOnlyField(source='parent_id')
    slug = serializers.SlugField(validators=[SlugValidator()])

    featured_image = ImageAttachmentSerializer(required=False, allow_null=True)
    featured_video = VideoAttachmentSerializer(required=False, allow_null=True)

    content = ContentSerializer()

    url = serializers.CharField(source='get_absolute_url', read_only=True)

    current_version = serializers.IntegerField(read_only=True,
                                               source='revision_id')

    template = TemplateSerializer(required=False, source='get_template')
    template_id = serializers.CharField(required=False, write_only=True)
    template_data = JSONField(required=False)
    updated_at = serializers.DateTimeField(read_only=True)

    class Meta:
        model = Page
        fields = ('id', 'slug', 'url', 'title', 'featured_image',
                  'featured_video', 'snippet', 'content', 'published_at',
                  'updated_at', 'is_published', 'published_version',
                  'current_version', 'latest_version', 'preview_id',
                  'template', 'template_id', 'template_data', 'seo_keyword',
                  'seo_description')
        authenticated_fields = ('template', 'preview_id')

    def create(self, validated_data):
        instance = Page()
        return self.update(instance, validated_data)

    def update(self, instance, validated_data):

        # Update all the basic fields
        instance.title = validated_data.get('title', instance.title)
        instance.slug = validated_data.get('slug', instance.slug)
        instance.snippet = validated_data.get('snippet', instance.snippet)
        instance.seo_keyword = validated_data.get('seo_keyword',
                                                  instance.seo_keyword)
        instance.seo_description = validated_data.get('seo_description',
                                                      instance.seo_description)
        instance.template = validated_data.get('template_id',
                                               instance.template)
        instance.template_data = validated_data.get('template_data',
                                                    instance.template_data)

        # Save instance before processing/saving content in order to save associations to correct ID
        instance.save()

        instance.content = validated_data.get('content', instance.content)

        featured_image = validated_data.get('featured_image', False)
        if featured_image != False:
            instance.save_featured_image(featured_image)

        featured_video = validated_data.get('featured_video', False)
        if featured_video != False:
            instance.save_featured_video(featured_video)

        # Perform a final save (without revision), update content and featured image
        instance.save(
            update_fields=['content', 'featured_image', 'featured_video'],
            revision=False)

        return instance
Example #16
0
class ItemRentalSerializer(serializers.HyperlinkedModelSerializer):
    rental = serializers.ReadOnlyField()

    class Meta:
        model = ItemsRentals
        fields = ('item_id', 'rental_id', 'rental')
Example #17
0
class AccidentSerializer(serializers.ModelSerializer):

    duty_manager_name_ch = serializers.ReadOnlyField()
    type_parent_id = serializers.ReadOnlyField(source='type.ptype.id',
                                               read_only=True)
    type_parent_name = serializers.ReadOnlyField(source='type.ptype.name',
                                                 read_only=True)
    type_id = serializers.ReadOnlyField(source='type.id', read_only=True)
    type_name = serializers.ReadOnlyField(source='type.name', read_only=True)
    status_name = serializers.ReadOnlyField(source='status.name',
                                            read_only=True)
    # duty_domains = AccidentDomainSerializer(many=True, read_only=True)
    duty_dept_ids = serializers.ReadOnlyField()
    duty_dept_names = serializers.ReadOnlyField()
    duty_domain_ids = serializers.ReadOnlyField()
    duty_domain_names = serializers.ReadOnlyField()
    # log = AccidentLogSerializer(many=True,)
    action = AccidentActionSerializer(many=True, read_only=True)
    find_user_department = serializers.ReadOnlyField()
    level_name = serializers.ReadOnlyField(source='get_level_display',
                                           read_only=True)
    time_length = serializers.ReadOnlyField()
    basic_sla = serializers.ReadOnlyField()
    detail_sla = serializers.ReadOnlyField()

    # type_parent_id = serializers.SerializerMethodField()

    class Meta:
        model = Accident
        fields = ('id', 'accidentid', 'title', 'status_name', 'is_accident',
                  'level', 'level_name', 'find_user_name',
                  'find_user_department', 'duty_manager_name',
                  'duty_manager_name_ch', 'duty_users', 'happened_time',
                  'finish_time', 'time_length', 'reason', 'process', 'comment',
                  'affect', 'is_online', 'is_online_str', 'health',
                  'is_available', 'type_id', 'type_name', 'type_parent_id',
                  'type_parent_name', 'is_punish', 'basicinfo_time',
                  'detailinfo_time', 'duty_dept_ids', 'duty_dept_names',
                  'duty_domain_ids', 'duty_domain_names', 'mantis_id',
                  'basic_sla', 'detail_sla', 'punish_users', 'punish_content',
                  'action')
class IndustriaSerializer(serializers.ModelSerializer):
    prov = serializers.ReadOnlyField(source='provincia.Provincia')
    mun = serializers.ReadOnlyField(source='municipio.Municipio')
    codprov = serializers.ReadOnlyField(source='provincia.CodProvincia')
    codmun = serializers.ReadOnlyField(source='municipio.CodCatastral')
    codact = serializers.ReadOnlyField(source='producto.CodActividad')
    actgen = serializers.ReadOnlyField(source='producto.Actividad')
    prod = serializers.ReadOnlyField(source='producto.Producto')
    codproducto = serializers.ReadOnlyField(source='producto.CodProducto')
    procesados = serializers.ReadOnlyField(source='prodcts')
    envasesProd = serializers.ReadOnlyField(source="envases")
    marcs = serializers.ReadOnlyField(source="marcas")

    class Meta:
        model = Industria
        fields = ('id', 'inscrito', 'procesados', 'envasesProd', 'marcs',
                  'matriculaRIA', 'provincia', 'municipio', 'declar_pac',
                  'Domicilio', 'CP', 'utmX', 'utmY', 'regSanit',
                  'regEmbotella', 'f_control', 'Estado', 'F_baja',
                  'expediente', 'ag_eco', 'tipProc', 'tipoCom', 'producto',
                  'codact', 'actgen', 'prod', 'codproducto', 'F_altaProducto',
                  'F_bajaProducto', 'productoCambiado', 'desc_product',
                  'f_ag_eco_prod', 'capacidad', 'form_pres', 'tam_emb',
                  'marcas_referencia', 'valor_produccion', 'prov', 'mun',
                  'codprov', 'codmun')
Example #19
0
class MeetingUserSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()
    username = serializers.ReadOnlyField(source='user.truename')
    class Meta:
        model = MeetingUser
        fields = '__all__'
Example #20
0
class PriceEstimateSerializer(serializers.HyperlinkedModelSerializer):
    scope = core_serializers.GenericRelatedField(
        related_models=models.PriceEstimate.get_estimated_models(),
        required=False)
    scope_name = serializers.ReadOnlyField(source='scope.name')
    scope_uuid = serializers.ReadOnlyField(source='scope.uuid')

    class Meta:
        model = models.PriceEstimate
        fields = ('url', 'uuid', 'scope', 'scope_name', 'scope_uuid', 'limit',
                  'total', 'threshold')
        read_only_fields = ('total', 'scope')
        extra_kwargs = {
            'url': {
                'lookup_field': 'uuid'
            },
        }

    def validate(self, attrs):
        if 'limit' in attrs:
            if isinstance(self.instance.scope, structure_models.Project):
                self._validate_project_limit(self.instance.scope,
                                             attrs['limit'])

            if isinstance(self.instance.scope, structure_models.Customer):
                self._validate_customer_limit(self.instance.scope,
                                              attrs['limit'])

        return attrs

    def _validate_project_limit(self, project, limit):
        customer = project.customer

        customer_limit = self._get_customer_limit(customer)
        if customer_limit == -1:
            return

        total_limit = self._get_total_limit(
            customer.projects.exclude(uuid=project.uuid)) + limit

        if total_limit > customer_limit:
            message = _(
                'Total price limits of projects exceeds organization price limit. '
                'Total limit: %(total_limit)s, organization limit: %(customer_limit)s'
            )
            context = dict(total_limit=total_limit,
                           customer_limit=customer_limit)
            raise serializers.ValidationError({'limit': message % context})

    def _validate_customer_limit(self, customer, limit):
        if limit == -1:
            return

        total_limit = self._get_total_limit(customer.projects.all())

        if limit < total_limit:
            message = _(
                'Organization limit cannot be less than a sum of its projects limits: %d'
            )
            raise serializers.ValidationError({'limit': message % total_limit})

    def _get_customer_limit(self, customer):
        try:
            estimate = models.PriceEstimate.objects.get(scope=customer)
            return estimate.limit
        except models.PriceEstimate.DoesNotExist:
            return -1

    def _get_total_limit(self, projects):
        if not projects.exists():
            return 0
        estimates = models.PriceEstimate.objects.filter(
            scope__in=projects).exclude(limit=-1)
        return estimates.aggregate(Sum('limit'))['limit__sum'] or 0
Example #21
0
class DirectorySerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()
    class Meta:
        model = Directory
        fields = '__all__'
class MissionSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Mission
        fields = ('id', 'title', 'completed', 'owner')
        class TestSerializer(serializers.ModelSerializer):
            missing = serializers.ReadOnlyField()

            class Meta:
                model = RegularFieldsModel
                fields = ('auto_field',)
Example #24
0
class DataSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Data
        fields = '__all__'
    class Meta:

        model = Recipe
        date = serializers.DateField(read_only=True)
        chef = serializers.ReadOnlyField()
        fields = '__all__'
Example #26
0
class DeviceSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username', required=False)

    class Meta:
        model = Device
        fields = '__all__'
class SnippetSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style', 'owner',)
Example #28
0
class ArticleSerializer(DispatchModelSerializer,
                        DispatchPublishableSerializer):
    """Serializes the Article model."""

    id = serializers.ReadOnlyField(source='parent_id')
    slug = serializers.SlugField(validators=[SlugValidator()])

    section = SectionSerializer(read_only=True)
    section_id = serializers.IntegerField(write_only=True)

    subsection = SubsectionSerializer(source='get_subsection', read_only=True)
    subsection_id = serializers.IntegerField(write_only=True,
                                             required=False,
                                             allow_null=True)

    featured_image = ImageAttachmentSerializer(required=False, allow_null=True)
    featured_video = VideoAttachmentSerializer(required=False, allow_null=True)

    content = ContentSerializer()

    authors = AuthorSerializer(many=True, read_only=True)
    author_ids = serializers.ListField(write_only=True,
                                       child=serializers.JSONField(),
                                       validators=[AuthorValidator])
    authors_string = serializers.CharField(source='get_author_string',
                                           read_only=True)

    tags = TagSerializer(many=True, read_only=True)
    tag_ids = serializers.ListField(write_only=True,
                                    required=False,
                                    child=serializers.IntegerField())

    topic = TopicSerializer(read_only=True)
    topic_id = serializers.IntegerField(write_only=True,
                                        allow_null=True,
                                        required=False)

    url = serializers.CharField(source='get_absolute_url', read_only=True)

    current_version = serializers.IntegerField(read_only=True,
                                               source='revision_id')

    template = TemplateSerializer(required=False, source='get_template')
    template_id = serializers.CharField(required=False, write_only=True)
    template_data = JSONField(required=False)

    integrations = JSONField(required=False)

    currently_breaking = serializers.BooleanField(
        source='is_currently_breaking', read_only=True)

    class Meta:
        model = Article
        fields = ('id', 'slug', 'url', 'headline', 'featured_image',
                  'featured_video', 'snippet', 'content', 'authors',
                  'author_ids', 'tags', 'tag_ids', 'topic', 'topic_id',
                  'authors_string', 'section', 'section_id', 'subsection',
                  'subsection_id', 'published_at', 'is_published',
                  'is_breaking', 'breaking_timeout', 'currently_breaking',
                  'published_version', 'current_version', 'latest_version',
                  'preview_id', 'importance', 'reading_time', 'template',
                  'template_id', 'template_data', 'seo_keyword',
                  'seo_description', 'integrations')
        authenticated_fields = ('template', 'integrations', 'preview_id')

    def create(self, validated_data):
        instance = Article()
        return self.update(instance, validated_data)

    def update(self, instance, validated_data):
        template = validated_data.get('template_id', instance.template)
        template_data = validated_data.get('template_data',
                                           instance.template_data)
        tag_ids = validated_data.get('tag_ids', False)

        tags = []
        if tag_ids != False:
            for tag_id in tag_ids:
                try:
                    tags.append(Tag.objects.get(id=int(tag_id)))
                except Tag.DoesNotExist:
                    pass

        TemplateValidator(template, template_data, tags)

        # Update basic fields
        instance.headline = validated_data.get('headline', instance.headline)
        instance.section_id = validated_data.get('section_id',
                                                 instance.section_id)
        instance.slug = validated_data.get('slug', instance.slug)
        instance.snippet = validated_data.get('snippet', instance.snippet)
        instance.reading_time = validated_data.get('reading_time',
                                                   instance.reading_time)
        instance.importance = validated_data.get('importance',
                                                 instance.importance)
        instance.is_breaking = validated_data.get('is_breaking',
                                                  instance.is_breaking)
        instance.breaking_timeout = validated_data.get(
            'breaking_timeout', instance.breaking_timeout)
        instance.seo_keyword = validated_data.get('seo_keyword',
                                                  instance.seo_keyword)
        instance.seo_description = validated_data.get('seo_description',
                                                      instance.seo_description)
        instance.integrations = validated_data.get('integrations',
                                                   instance.integrations)
        instance.template = template
        instance.template_data = template_data

        instance.save()

        instance.content = validated_data.get('content', instance.content)

        featured_image = validated_data.get('featured_image', False)
        if featured_image != False:
            instance.save_featured_image(featured_image)

        featured_video = validated_data.get('featured_video', False)
        if featured_video != False:
            instance.save_featured_video(featured_video)

        authors = validated_data.get('author_ids')

        if authors:
            instance.save_authors(authors, is_publishable=True)

        if tag_ids != False:
            instance.save_tags(tag_ids)

        topic_id = validated_data.get('topic_id', False)
        if topic_id != False:
            instance.save_topic(topic_id)

        subsection_id = validated_data.get('subsection_id', None)
        instance.save_subsection(subsection_id)

        # Perform a final save (without revision), update content and featured image
        instance.save(update_fields=[
            'content', 'featured_image', 'featured_video', 'topic'
        ],
                      revision=False)

        return instance
Example #29
0
class BaseProjectSerializer(serializers.HyperlinkedModelSerializer):
    """
    BaseProjectSerializer class.
    """
    projectid = serializers.ReadOnlyField(source='id')
    url = serializers.HyperlinkedIdentityField(view_name='project-detail',
                                               lookup_field='pk')
    owner = serializers.HyperlinkedRelatedField(
        view_name='user-detail',
        source='organization',
        lookup_field='username',
        queryset=User.objects.exclude(
            username__iexact=settings.ANONYMOUS_DEFAULT_USERNAME))
    created_by = serializers.HyperlinkedRelatedField(view_name='user-detail',
                                                     lookup_field='username',
                                                     read_only=True)
    metadata = JsonField(required=False)
    starred = serializers.SerializerMethodField()
    users = serializers.SerializerMethodField()
    forms = serializers.SerializerMethodField()
    public = serializers.BooleanField(source='shared')
    tags = TagListSerializer(read_only=True)
    num_datasets = serializers.SerializerMethodField()
    last_submission_date = serializers.SerializerMethodField()
    teams = serializers.SerializerMethodField()

    class Meta:
        model = Project
        fields = [
            'url', 'projectid', 'owner', 'created_by', 'metadata', 'starred',
            'users', 'forms', 'public', 'tags', 'num_datasets',
            'last_submission_date', 'teams', 'name', 'date_created',
            'date_modified', 'deleted_at'
        ]

    def get_starred(self, obj):
        """
        Return True if request user has starred this project.
        """
        return is_starred(obj, self.context['request'])

    def get_users(self, obj):
        """
        Return a list of users and organizations that have access to the
        project.
        """
        owner_query_param_in_request = 'request' in self.context and\
            "owner" in self.context['request'].GET
        return get_users(obj, self.context, owner_query_param_in_request)

    @check_obj
    def get_forms(self, obj):
        """
        Return list of xforms in the project.
        """
        forms = cache.get('{}{}'.format(PROJ_BASE_FORMS_CACHE, obj.pk))
        if forms:
            return forms

        xforms = get_project_xforms(obj)
        request = self.context.get('request')
        serializer = BaseProjectXFormSerializer(xforms,
                                                context={'request': request},
                                                many=True)
        forms = list(serializer.data)
        cache.set('{}{}'.format(PROJ_BASE_FORMS_CACHE, obj.pk), forms)

        return forms

    def get_num_datasets(self, obj):  # pylint: disable=no-self-use
        """
        Return the number of datasets attached to the project.
        """
        return get_num_datasets(obj)

    def get_last_submission_date(self, obj):  # pylint: disable=no-self-use
        """
        Return the most recent submission date to any of the projects datasets.
        """
        return get_last_submission_date(obj)

    def get_teams(self, obj):  # pylint: disable=no-self-use
        """
        Return the teams with access to the project.
        """
        return get_teams(obj)
Example #30
0
class ExamDetailSerializer(serializers.ModelSerializer):
    """Serializer Exam model database
    Return Exam model serializer
    For only examiner, for CreateUpdateRetrive APIView
    View Nested Serializer for 'exam-detail'
    Create and Update Exam instance and releted with Question model

    Validate id of questions updated
     - control that question id belong to updated exam instance
    """

    exam_questions = QuestionSerializer(many=True)
    examiner = serializers.ReadOnlyField(source='examiner.username')
    test = serializers.HyperlinkedIdentityField(view_name='exam-test')
    assesments = serializers.HyperlinkedIdentityField(
        view_name='exam-assesment')
    set_grades = serializers.HyperlinkedIdentityField(
        view_name='exam-judge-results')

    class Meta:
        model = models.Exam
        fields = ('url', 'id', 'examiner', 'title', 'topic', 'created_in',
                  'avaiable', 'test', 'answered', 'assesments', 'checking',
                  'set_grades', 'judged', 'archivized', 'archivized_in',
                  'exam_questions')

    def create(self, validated_data):
        questions_data = validated_data.pop('exam_questions')
        exam = models.Exam.objects.create(**validated_data)
        for question in questions_data:
            models.Question.objects.create(exam=exam, **question_data)
        return exam

    def update(self, instance, validated_data):
        questions_data = validated_data.pop('exam_questions')
        instance.avaiable = validated_data.get('avaiable', instance.avaiable)
        instance.title = validated_data.get('title', instance.title)
        instance.topic = validated_data.get('topic', instance.topic)
        instance.archivized = validated_data.get('archivized',
                                                 instance.archivized)
        instance.save()
        # Checking questions if some of them are deleted
        questions_preview = [
            x.id for x in models.Question.objects.filter(exam=instance)
        ]
        questions_actuall = [
            x.get('id') for x in questions_data if x.get('id') != None
        ]
        for x in questions_preview:
            if x not in questions_actuall:
                models.Question.objects.get(id=x).delete()
        # Adding new and updating questions
        for question in questions_data:
            nr = question.get('id', None)
            if nr:
                q = models.Question.objects.filter(id=nr, exam=instance)
                if q.exists():
                    q = q.first()
                    q.question_text = question.get('question_text',
                                                   q.question_text)
                    q.max_points = question.get('max_points', q.question_text)
                    q.save()
                else:
                    raise serializers.ValidationError(
                        'You cant edit/create question with this id.')
            else:
                models.Question.objects.create(exam=instance, **question)
        return instance