Esempio n. 1
0
class Media(Document):
    owner = LazyReferenceField('User', required=True)
    folder = StringField(required=True)
    filename = StringField(unique_with=('folder', 'private'))
    file = FileField()
    dir = BooleanField()
    container = BooleanField(default=False)
    metadata = DictField()
    processing = BooleanField(default=False)
    percentDone = FloatField()
    private = BooleanField(default=False)
    associatedMedia = ListField(
        LazyReferenceField('Media', reverse_delete_rule=PULL))

    if MongoSettings.DEFAULT_CONNECT_URI != MongoSettings.MEDIA_CONNECT_URI:
        meta = {'db_alias': 'media-db'}

    @classmethod
    def post_save(cls, sender, document: Media, **kwargs):
        message = None
        if not (document.private or document.processing):
            message = {
                'type': 'update',
                'payload': {
                    'folder': document.folder,
                    'created': kwargs['created']
                }
            }
        elif document.processing:
            message = {
                'type': 'processing update',
                'payload': {
                    'id': str(document.id),
                    'percentDone': document.percentDone
                }
            }

        if message:
            # Workaround to allow sending in normal and async methods as mediaBrowserManger.broadcast is async
            try:
                loop = asyncio.get_running_loop()
            except RuntimeError:
                loop = None

            if loop and loop.is_running():
                loop.create_task(mediaBrowserManager.broadcast(message))
            else:
                asyncio.run(mediaBrowserManager.broadcast(message))

    def serialize(self, associatedMedia: Optional[bool] = False):
        out = {
            'id': str(self.id),
            'owner': str(self.owner.id),
            'folder': self.folder,
            'filename': self.filename
        }
        if self.dir and not associatedMedia:
            out['dir'] = self.dir
        if self.container:
            out['container'] = self.container
            size = 0
            for subMedia in self.associatedMedia:
                subMedia = subMedia.fetch()
                if subMedia.file:
                    size += subMedia.file.length
            out['size'] = size
        if self.file:
            out['mimetype'] = self.file.content_type
            out['size'] = self.file.length
        if self.metadata:
            out['metadata'] = self.metadata
        if self.associatedMedia and not associatedMedia:
            out['associatedMedia'] = list(
                map(lambda m: m.fetch().serialize(True), self.associatedMedia))
        if self.processing:
            out['processing'] = self.processing
            out['percentDone'] = self.percentDone
        if self.private:
            out['private'] = self.private
        return out
Esempio n. 2
0
class Trade(EmbeddedDocument):
    quantity        = FloatField()
    trade_type      = StringField()
    price           = FloatField()
    timestamp       = DateTimeField()
Esempio n. 3
0
class DbBarData(Document):
    """
    Candlestick bar data for database storage.

    Index is defined unique with datetime, interval, symbol
    """

    symbol: str = StringField()
    exchange: str = StringField()
    datetime: datetime = DateTimeField()
    interval: str = StringField()

    volume: float = FloatField()
    open_interest: float = FloatField()
    open_price: float = FloatField()
    high_price: float = FloatField()
    low_price: float = FloatField()
    close_price: float = FloatField()

    meta = {
        "indexes": [
            {
                "fields": ("symbol", "exchange", "interval", "datetime"),
                "unique": True,
            }
        ]
    }

    @staticmethod
    def from_bar(bar: BarData):
        """
        Generate DbBarData object from BarData.
        """
        db_bar = DbBarData()

        db_bar.symbol = bar.symbol
        db_bar.exchange = bar.exchange.value
        db_bar.datetime = bar.datetime
        db_bar.interval = bar.interval.value
        db_bar.volume = bar.volume
        db_bar.open_interest = bar.open_interest
        db_bar.open_price = bar.open_price
        db_bar.high_price = bar.high_price
        db_bar.low_price = bar.low_price
        db_bar.close_price = bar.close_price

        return db_bar

    def to_bar(self):
        """
        Generate BarData object from DbBarData.
        """
        bar = BarData(
            symbol=self.symbol,
            exchange=Exchange(self.exchange),
            datetime=self.datetime,
            interval=Interval(self.interval),
            volume=self.volume,
            open_interest=self.open_interest,
            open_price=self.open_price,
            high_price=self.high_price,
            low_price=self.low_price,
            close_price=self.close_price,
            gateway_name="DB",
        )
        return bar
Esempio n. 4
0
class Score(Document):
    class_id = StringField()
    qbank_code = StringField()
    student_id = StringField()
    student_name = StringField()
    score = FloatField()
Esempio n. 5
0
class CAIM(Request):

    full_name = 'Cancelación de asignaturas con carga inferior a la mínima'

    percentaje = FloatField(display='Porcentaje de avance de carrrera')
    enrollments = IntField(display='Número de matrículas')
    gpa = FloatField(display='P.A.P.A.')
    available_credits = IntField(display='Créditos disponibles')
    remaining_credits = IntField(display='Créditos restantes')
    subjects = EmbeddedDocumentListField(
        Subject, required=True, display='Asignaturas')

    regulation_list = ['008|2008|CSU']  # List of regulations

    str_cm = [
        'cursar el periodo académico {} con un número de créditos inferior al mínimo exigido, ',
        'cancelar la(s) siguiente(s) asignatura(s) inscrita(s) del periodo {}.',
        'debido a que {}realiza debidamente la solicitud.',
        '(Artículo 10 del {}).',
        '(Artículo 15 del {}).'
    ]

    str_pcm = [
        'SIA: Porcentaje de avance en el plan: {}%. Número de matrículas: {}. P.A.P.A.: {}.',
        'SIA: Créditos disponibles: {}. ',
        'SIA: Al aprobar la cancelación de la(s) asignatura(s) solicitada(s) el estudiante ' +
        'quedaría con {} créditos inscritos.'
    ]

    def cm(self, docx):
        if self.is_affirmative_response_approval_status():
            self.cm_ap(docx)
        else:
            self.cm_na(docx)

    def cm_ap(self, docx):
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        paragraph.add_run(self.str_council_header + ':')
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.style = 'List Bullet'
        self.cm_answer(paragraph)
        paragraph.add_run(self.str_cm[2].format('') + ' ')
        paragraph.add_run(self.str_cm[3].format(
            Request.regulations[self.regulation_list[0]][0]))
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.style = 'List Bullet'
        paragraph.add_run(
            # pylint: disable=no-member
            self.get_approval_status_display().upper()).font.bold = True
        paragraph.add_run(' ' + self.str_cm[1].format(
            self.academic_period) + ' ')
        paragraph.add_run(self.str_cm[4].format(
            Request.regulations[self.regulation_list[0]][0]))
        table_subjects(docx, Subject.subjects_to_array(self.subjects))

    def cm_na(self, docx):
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        paragraph.add_run(self.str_council_header + ' ')
        self.cm_answer(paragraph)
        paragraph.add_run(self.str_cm[2].format('no ') + ' ')
        paragraph.add_run(self.str_cm[3].format(
            Request.regulations[self.regulation_list[0]][0]))

    def cm_answer(self, paragraph):
        paragraph.add_run(
            # pylint: disable=no-member
            self.get_approval_status_display().upper() + ' ').font.bold = True
        # pylint: disable=no-member
        paragraph.add_run(self.str_cm[0].format(self.academic_period))

    def pcm(self, docx):
        self.pcm_analysis(docx)
        if self.is_affirmative_response_advisor_response():
            self.pcm_ap(docx)
        else:
            self.pcm_na(docx)

    def pcm_ap(self, docx):
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        paragraph.add_run(self.str_comittee_header + ':')
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.style = 'List Bullet'
        self.pcm_answer(paragraph)
        paragraph.add_run(self.str_cm[2].format('') + ' ')
        paragraph.add_run(self.str_cm[3].format(
            Request.regulations[self.regulation_list[0]][0]))
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.style = 'List Bullet'
        paragraph.add_run(
            # pylint: disable=no-member
            self.get_advisor_response_display().upper()).font.bold = True
        paragraph.add_run(' ' + self.str_cm[1].format(
            self.academic_period) + ' ')
        paragraph.add_run(self.str_cm[4].format(
            Request.regulations[self.regulation_list[0]][0]))
        table_subjects(docx, Subject.subjects_to_array(self.subjects))

    def pcm_na(self, docx):
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        paragraph.add_run(self.str_comittee_header + ' ')
        self.pcm_answer(paragraph)
        paragraph.add_run(self.str_cm[2].format('no ') + ' ')
        paragraph.add_run(self.str_cm[3].format(
            Request.regulations[self.regulation_list[0]][0]))

    def pcm_answer(self, paragraph):
        paragraph.add_run(
            # pylint: disable=no-member
            self.get_advisor_response_display().upper() + ' ').font.bold = True
        # pylint: disable=no-member
        paragraph.add_run(self.str_cm[0].format(self.academic_period))

    def pcm_analysis(self, docx):
        analysis_list = []
        analysis_list += [self.str_pcm[0].format(
            self.percentaje,
            self.enrollments,
            self.gpa
        )]
        analysis_list += [self.str_pcm[1].format(
            self.available_credits
        )]
        analysis_list += [self.str_pcm[2].format(
            self.remaining_credits
        )]
        analysis_list += self.extra_analysis
        add_analysis_paragraph(docx, analysis_list)
Esempio n. 6
0
class Pokemon(Document):
    name = StringField(required=True)
    price = FloatField(required=True)
    description = StringField(required=True)
Esempio n. 7
0
class Meals(Document):
    name = StringField(required=True)
    description = StringField(max_length=240)
    price = FloatField()
    image_url = StringField()
Esempio n. 8
0
class Grade(EmbeddedDocument):
    name = StringField(required=True)
    score = FloatField(required=True)
Esempio n. 9
0
class BCCVesselTypeSizePrice(Document):
    __tablename__ = 'bcc_vessel_size_price'
    type = ReferenceField(BCCVesselType, required=True)
    size = ReferenceField(BCCVesselSize, required=True)
    fee = FloatField(required=True)
Esempio n. 10
0
class EncodeStream(HardwareStream):
    def __init__(self, *args, **kwargs):
        super(EncodeStream, self).__init__(*args, **kwargs)

    relay_video = BooleanField(default=constants.DEFAULT_RELAY_VIDEO,
                               required=True)
    relay_audio = BooleanField(default=constants.DEFAULT_RELAY_AUDIO,
                               required=True)
    deinterlace = BooleanField(default=constants.DEFAULT_DEINTERLACE,
                               required=True)
    frame_rate = IntField(default=constants.INVALID_FRAME_RATE, required=True)
    volume = FloatField(default=constants.DEFAULT_VOLUME, required=True)
    video_codec = StringField(default=constants.DEFAULT_VIDEO_CODEC,
                              required=True)
    audio_codec = StringField(default=constants.DEFAULT_AUDIO_CODEC,
                              required=True)
    audio_channels_count = IntField(
        default=constants.INVALID_AUDIO_CHANNELS_COUNT, required=True)
    size = EmbeddedDocumentField(Size, default=Size())
    video_bit_rate = IntField(default=constants.INVALID_VIDEO_BIT_RATE,
                              required=True)
    audio_bit_rate = IntField(default=constants.INVALID_AUDIO_BIT_RATE,
                              required=True)
    logo = EmbeddedDocumentField(Logo, default=Logo())
    aspect_ratio = EmbeddedDocumentField(Rational, default=Rational())

    def get_type(self):
        return constants.StreamType.ENCODE

    def get_relay_video(self):
        return self.relay_video

    def get_relay_audio(self):
        return self.relay_audio

    def config(self) -> dict:
        conf = super(EncodeStream, self).config()
        conf[ConfigFields.RELAY_VIDEO_FIELD] = self.get_relay_video()
        conf[ConfigFields.RELAY_AUDIO_FIELD] = self.get_relay_audio()
        conf[ConfigFields.DEINTERLACE_FIELD] = self.get_deinterlace()
        frame_rate = self.get_frame_rate()
        if frame_rate != constants.INVALID_FRAME_RATE:
            conf[ConfigFields.FRAME_RATE_FIELD] = frame_rate
        conf[ConfigFields.VOLUME_FIELD] = self.get_volume()
        conf[ConfigFields.VIDEO_CODEC_FIELD] = self.get_video_codec()
        conf[ConfigFields.AUDIO_CODEC_FIELD] = self.get_audio_codec()
        audio_channels = self.get_audio_channels_count()
        if audio_channels != constants.INVALID_AUDIO_CHANNELS_COUNT:
            conf[ConfigFields.AUDIO_CHANNELS_COUNT_FIELD] = audio_channels

        if self.size.is_valid():
            conf[ConfigFields.SIZE_FIELD] = str(self.size)

        vid_rate = self.get_video_bit_rate()
        if vid_rate != constants.INVALID_VIDEO_BIT_RATE:
            conf[ConfigFields.VIDEO_BIT_RATE_FIELD] = vid_rate
        audio_rate = self.get_audio_bit_rate()
        if audio_rate != constants.INVALID_AUDIO_BIT_RATE:
            conf[ConfigFields.AUDIO_BIT_RATE_FIELD] = self.get_audio_bit_rate()
        if self.logo.is_valid():
            conf[ConfigFields.LOGO_FIELD] = self.logo.to_dict()
        if self.aspect_ratio.is_valid():
            conf[ConfigFields.ASPCET_RATIO_FIELD] = str(self.aspect_ratio)
        return conf

    def get_deinterlace(self):
        return self.deinterlace

    def get_frame_rate(self):
        return self.frame_rate

    def get_volume(self):
        return self.volume

    def get_video_codec(self):
        return self.video_codec

    def get_audio_codec(self):
        return self.audio_codec

    def get_audio_channels_count(self):
        return self.audio_channels_count

    def get_video_bit_rate(self):
        return self.video_bit_rate

    def get_audio_bit_rate(self):
        return self.audio_bit_rate

    def fixup_output_urls(self):
        return self._fixup_http_output_urls()

    @classmethod
    def make_stream(cls, settings):
        stream = cls()
        stream._settings = settings
        stream.input = InputUrls(urls=[InputUrl(id=InputUrl.generate_id())])
        stream.output = OutputUrls(
            urls=[OutputUrl(id=OutputUrl.generate_id())])
        return stream
Esempio n. 11
0
class Coordinates(EmbeddedDocument):
    lat = FloatField(default=5)
    lng = FloatField(default=5)
    update_date = DateTimeField(default=datetime.datetime.now())
Esempio n. 12
0
class IStream(Document):
    meta = {
        'collection': 'streams',
        'allow_inheritance': True,
        'auto_create_index': True
    }

    created_date = DateTimeField(default=datetime.now)  # for inner use
    name = StringField(default=constants.DEFAULT_STREAM_NAME,
                       max_length=constants.MAX_STREAM_NAME_LENGTH,
                       min_length=constants.MIN_STREAM_NAME_LENGTH,
                       required=True)
    group = StringField(default=constants.DEFAULT_STREAM_GROUP_TITLE,
                        max_length=constants.MAX_STREAM_GROUP_TITLE_LENGTH,
                        min_length=constants.MIN_STREAM_GROUP_TITLE_LENGTH,
                        required=True)

    tvg_id = StringField(default=constants.DEFAULT_STREAM_TVG_ID,
                         max_length=constants.MAX_STREAM_TVG_ID_LENGTH,
                         min_length=constants.MIN_STREAM_TVG_ID_LENGTH,
                         required=True)
    tvg_name = StringField(default=constants.DEFAULT_STREAM_TVG_NAME,
                           max_length=constants.MAX_STREAM_NAME_LENGTH,
                           min_length=constants.MIN_STREAM_NAME_LENGTH,
                           required=True)  #
    tvg_logo = StringField(default=constants.DEFAULT_STREAM_ICON_URL,
                           max_length=constants.MAX_URL_LENGTH,
                           min_length=constants.MIN_URL_LENGTH,
                           required=True)  #

    price = FloatField(default=0.0,
                       min_value=constants.MIN_PRICE,
                       max_value=constants.MAX_PRICE,
                       required=True)

    output = EmbeddedDocumentField(OutputUrls, default=OutputUrls())  #

    def get_groups(self) -> list:
        return self.group.split(';')

    def to_dict(self) -> dict:
        return {
            StreamFields.NAME: self.name,
            StreamFields.ID: self.get_id(),
            StreamFields.TYPE: self.get_type(),
            StreamFields.ICON: self.tvg_logo,
            StreamFields.PRICE: self.price,
            StreamFields.GROUP: self.group
        }

    def __init__(self, *args, **kwargs):
        super(IStream, self).__init__(*args, **kwargs)
        self._settings = None

    def set_server_settings(self, settings):
        self._settings = settings

    def get_type(self):
        raise NotImplementedError('subclasses must override get_type()!')

    def get_id(self) -> str:
        return str(self.id)

    def config(self) -> dict:
        return {
            ConfigFields.ID_FIELD: self.get_id(),  # required
            ConfigFields.TYPE_FIELD: self.get_type(),  # required
            ConfigFields.OUTPUT_FIELD:
            self.output.to_mongo()  # required empty in timeshift_record
        }

    def fixup_output_urls(self):
        return

    def reset(self):
        return

    def generate_playlist(self, header=True) -> str:
        result = '#EXTM3U\n' if header else ''
        stream_type = self.get_type()
        if stream_type == constants.StreamType.RELAY or \
                stream_type == constants.StreamType.ENCODE or \
                stream_type == constants.StreamType.TIMESHIFT_PLAYER or \
                stream_type == constants.StreamType.VOD_ENCODE or \
                stream_type == constants.StreamType.VOD_RELAY or \
                stream_type == constants.StreamType.COD_ENCODE or \
                stream_type == constants.StreamType.COD_RELAY or \
                stream_type == constants.StreamType.PROXY:
            for out in self.output.urls:
                result += '#EXTINF:-1 tvg-id="{0}" tvg-name="{1}" tvg-logo="{2}" group-title="{3}",{4}\n{5}\n'.format(
                    self.tvg_id, self.tvg_name, self.tvg_logo, self.group,
                    self.name, out.uri)

        return result

    def generate_device_playlist(self,
                                 uid: str,
                                 passwd: str,
                                 did: str,
                                 lb_server_host_and_port: str,
                                 header=True) -> str:
        result = '#EXTM3U\n' if header else ''
        stream_type = self.get_type()
        if stream_type == constants.StreamType.PROXY or \
                stream_type == constants.StreamType.VOD_PROXY or \
                stream_type == constants.StreamType.RELAY or \
                stream_type == constants.StreamType.ENCODE or \
                stream_type == constants.StreamType.TIMESHIFT_PLAYER or \
                stream_type == constants.StreamType.VOD_ENCODE or \
                stream_type == constants.StreamType.VOD_RELAY or \
                stream_type == constants.StreamType.COD_ENCODE or \
                stream_type == constants.StreamType.COD_RELAY:
            for out in self.output.urls:
                parsed_uri = urlparse(out.uri)
                if parsed_uri.scheme == 'http' or parsed_uri.scheme == 'https':
                    file_name = os.path.basename(parsed_uri.path)
                    url = 'http://{0}/{1}/{2}/{3}/{4}/{5}/{6}'.format(
                        lb_server_host_and_port, uid, passwd, did, self.id,
                        out.id, file_name)
                    result += '#EXTINF:-1 tvg-id="{0}" tvg-name="{1}" tvg-logo="{2}" group-title="{3}",{4}\n{5}\n'.format(
                        self.tvg_id, self.tvg_name, self.tvg_logo, self.group,
                        self.name, url)

        return result

    def generate_input_playlist(self, header=True) -> str:
        raise NotImplementedError(
            'subclasses must override generate_input_playlist()!')

    def save(self, *args, **kwargs):
        super(IStream, self).save(*args, **kwargs)
        self.fixup_output_urls()
        return super(IStream, self).save(*args, **kwargs)
Esempio n. 13
0
class Coupon(Post):
    code = StringField(unique=True)
    discountType = StringField(choices=['percent', 'dollar'])
    discount = FloatField()
    storeWide = BooleanField(default=False)
    applicableProducts = ListField(ReferenceField('Product'))
    uses = IntField(default=0)
    maxUses = IntField(default=-1)

    @classmethod
    def schema(cls):
        return super().schema() + [{
            'name': 'code',
            'niceName': 'Code',
            'controlType': 'input'
        }, {
            'name':
            'discountType',
            'niceName':
            'Discount Type',
            'controlType':
            'select',
            'options': [{
                'key': 'Percent',
                'value': 'percent'
            }, {
                'key': 'Dollar',
                'value': 'dollar'
            }]
        }, {
            'name': 'discount',
            'niceName': 'Discount',
            'controlType': 'input',
            'type': 'number'
        }, {
            'name': 'storeWide',
            'niceName': 'Store wide',
            'controlType': 'checkbox'
        }, {
            'name': 'applicableProducts',
            'niceName': 'Applicable Products',
            'controlType': 'post-select',
            'type': 'models.Product',
            'multiple': True
        }, {
            'name': 'maxUses',
            'niceName': 'Max Uses',
            'controlType': 'input',
            'type': 'number'
        }]

    def serialize(self):
        return {
            **super().serialize(), 'code':
            self.code,
            'discountType':
            self.discountType,
            'discount':
            self.discount,
            'storeWide':
            self.storeWide,
            'applicableProducts':
            list(map(lambda p: str(p.id), self.applicableProducts)),
            'uses':
            self.uses,
            'maxUses':
            self.maxUses
        }
Esempio n. 14
0
class Product(Post):
    sku = StringField()
    img = ListField(ReferenceField('Media', reverse_delete_rule=PULL))
    price = DecimalField(precision=2)
    digital = BooleanField(default=False)
    taxable = BooleanField(default=True)

    hasStock = BooleanField(default=False)
    stock = IntField()

    totalReviews = IntField(default=0)
    avgReviewScore = FloatField(default=0)

    def addReview(self, score):
        self.avgReviewScore = ((self.avgReviewScore * self.totalReviews) +
                               int(score)) / (self.totalReviews + 1)
        self.totalReviews = self.totalReviews + 1

    @classmethod
    def schema(cls):
        return super().schema() + [{
            'name': 'sku',
            'niceName': 'SKU',
            'controlType': 'input'
        }, {
            'name': 'img',
            'niceName': 'Images',
            'controlType': 'media-browser',
            'multiple': True
        }, {
            'name': 'price',
            'niceName': 'Price',
            'controlType': 'input',
            'type': 'number'
        }, {
            'name': 'digital',
            'niceName': 'Digital',
            'controlType': 'checkbox'
        }, {
            'name': 'taxable',
            'niceName': 'Taxable',
            'controlType': 'checkbox'
        }, {
            'name': 'hasStock',
            'niceName': 'Has Stock',
            'controlType': 'checkbox'
        }, {
            'name': 'stock',
            'niceName': 'Stock',
            'controlType': 'input',
            'type': 'number',
            'validators': {
                'required': True
            }
        }]

    def serialize(self):
        return {
            **super().serialize(),
            'sku': self.sku,
            'img': list(map(lambda m: str(m.id), self.img)),
            'price': float(self.price) if self.price else None,
            "digital": self.digital,
            "taxable": self.taxable,
            'hasStock': self.hasStock,
            'stock': self.stock,
            'totalReviews': self.totalReviews,
            'avgReviewScore': round(self.avgReviewScore,
                                    1)  # Round to 1 decimal place
        }
Esempio n. 15
0
class REINPRE(Request):
    RL_ANSWER_RENOV_MATRICULA = 'RM'
    RL_ANSWER_PAPA = 'PA'
    RL_ANSWER_CUPO_CREDITOS = 'CC'
    RL_ANSWER_SANCION = 'SA'
    RL_ANSWER_OTRO = 'OT'
    RL_ANSWER_CHOICES = ((
        RL_ANSWER_RENOV_MATRICULA,
        'No cumplir con los requisitos exigidos para la' +
        ' renovación de la matrícula, en los plazos señalados por la Universidad.'
    ), (
        RL_ANSWER_PAPA,
        'Presentar un Promedio Aritmético Ponderado Acumulado menor que tres punto cero (3.0).'
    ), (
        RL_ANSWER_CUPO_CREDITOS,
        'No disponer de un cupo de créditos suficiente para inscribir las asignaturas'
        + ' del plan de estudios pendientes de aprobación.'
    ), (RL_ANSWER_SANCION,
        'Recibir sanción disciplinaria de expulsión o suspensión impuesta de acuerdo'
        + ' con las normas vigentes.'), (RL_ANSWER_OTRO, 'Otro.'))

    full_name = 'Reingreso Pregrado'

    regulation_list = ['008|2008|CSU', '239|2009|VAC', '012|2014|VAC']

    reing_period = StringField(required=True,
                               display='Periodo de reingreso',
                               choices=Request.PERIOD_CHOICES,
                               default=Request.PERIOD_DEFAULT)
    loss_period = StringField(
        required=True,
        display='Periodo de perdida de calidad de estudiante',
        choices=Request.PERIOD_CHOICES,
        default=Request.PERIOD_DEFAULT)
    first_reing = BooleanField(required=True,
                               display='Primer reingreso',
                               default=True)
    admission_period = StringField(required=True,
                                   display='Periodo de admisión',
                                   choices=Request.PERIOD_CHOICES,
                                   default=Request.PERIOD_DEFAULT)
    periods_since = IntField(
        required=True,
        display='periodos desde pérdida de calidad de estudiante',
        default=0)
    papa = FloatField(required=True, display='PAPA', default=0.0)
    reason_of_loss = StringField(choices=RL_ANSWER_CHOICES,
                                 default=RL_ANSWER_OTRO,
                                 display='Razón pérdida calidad de estudiante')
    credits_minus_remaining = IntField(
        required=True,
        display='Cupo de créditos menos créditos pendientes',
        default=0)
    credits_remaining = IntField(required=True,
                                 display='Créditos restantes',
                                 default=0)
    credits_english = IntField(required=True,
                               display='Créditos inglés',
                               default=0)
    credits_add = IntField(
        required=True,
        display='Créditos requeridos para inscribir asignaturas',
        default=0)

    min_grade_12c = StringField(
        required=True,
        display='Promedio semestral mínimo requerido para mantener la ' +
        'calidad de estudiante con 12 créditos inscritos: ',
        default='')
    min_grade_15c = StringField(
        required=True,
        display='Promedio semestral mínimo requerido para mantener la ' +
        'calidad de estudiante con 15 créditos inscritos: ',
        default='')
    min_grade_18c = StringField(
        required=True,
        display='Promedio semestral mínimo requerido para mantener la ' +
        'calidad de estudiante con 18 créditos inscritos: ',
        default='')
    min_grade_21c = StringField(
        required=True,
        display='Promedio semestral mínimo requerido para mantener la ' +
        'calidad de estudiante con 21 créditos inscritos: ',
        default='')

    # Exiged credits
    exi_fund_m = IntField(
        required=True,
        display='Créditos de fundamentación obligatorios exigidos',
        default=0)
    exi_fund_o = IntField(
        required=True,
        display='Créditos de fundamentación optativos exigidos',
        default=0)
    exi_disc_m = IntField(
        required=True,
        display='Créditos disciplinares obligatorios exigidos',
        default=0)
    exi_disc_o = IntField(required=True,
                          display='Créditos disciplinares optativos exigidos',
                          default=0)
    exi_free = IntField(required=True,
                        display='Créditos de libre elección exigidos',
                        default=0)

    # Approved credits
    app_fund_m = IntField(
        required=True,
        display='Créditos de fundamentación obligatorios aprobados',
        default=0)
    app_fund_o = IntField(
        required=True,
        display='Créditos de fundamentación optativos aprobados',
        default=0)
    app_disc_m = IntField(
        required=True,
        display='Créditos disciplinares obligatorios aprobados',
        default=0)
    app_disc_o = IntField(required=True,
                          display='Créditos disciplinares optativos aprobados',
                          default=0)
    app_free = IntField(required=True,
                        display='Créditos de libre elección aprobados',
                        default=0)

    # Remaining credits
    rem_fund_m = IntField(
        required=True,
        display='Créditos de fundamentación obligatorios restantes',
        default=0)
    rem_fund_o = IntField(
        required=True,
        display='Créditos de fundamentación optativos restantes',
        default=0)
    rem_disc_m = IntField(
        required=True,
        display='Créditos disciplinares obligatorios restantes',
        default=0)
    rem_disc_o = IntField(required=True,
                          display='Créditos disciplinares optativos restantes',
                          default=0)
    rem_free = IntField(required=True,
                        display='Créditos de libre elección restantes',
                        default=0)

    comitee_act = StringField(required=True,
                              display='Número de acta de comité',
                              default='00')

    comitee_date = DateField(required=True,
                             display='Fecha de reunión del comité',
                             default=datetime.date.today)

    # Pre-cm variables
    request_in_date = BooleanField(display='Solicitud a tiempo', default=True)
    credits_granted = IntField(display='Créditos otorgados', default=0)

    str_pcm_pre = [
        # Used in pcm and cm:
        'reingreso por única vez a partir del periodo académico ',
        'Si el estudiante no renueva su matrícula en el semestre de reingreso, el acto'
        + ' académico expedido por el Consejo de Facultad queda sin efecto.',
        '1. Datos Generales:',
        '2. Información Académica:',
        '3. Resumen general de créditos del plan de estudios:',
        '*Sin incluir los créditos correspondientes al cumplimiento del requisito de'
        + ' suficiencia en idioma.',

        # Used only in pcm:
        'El estudiante ',
        ' tiene pendiente por aprobar ',
        ' créditos del plan de estudios de ',
        ' y ',
        ' créditos del requisito de nivelación',
        ' - inglés, con un cupo disponible para inscripción de ',
        ' créditos.',
        'El parágrafo del artículo 11 del ',
        'Superior Universitario establece: ',
        '"Los créditos adicionales que como resultado del ' +
        'proceso de clasificación en la admisión deba aprobar ' +
        'un estudiante de pregrado, se sumarán por única vez al "' +
        'cupo adicional de créditos para inscripción"',
        ', por lo tanto solo es viable otorgar ',
        ' crédito(s) para la inscripción de asignaturas pendientes del plan de estudios de ',

        # Extra credits (optional):
        'y otorga ',
        ' crédito(s) adicional(es) para culminar su plan de estudios. '
    ]

    str_analysis = [
        '{}a tenido otro reingreso después de 2009-01 (Artículo 46, {}). ' +
        'Universitas y SIA: Revisado.',
        'Si perdió calidad antes de 2009-01: Equivalencias incluyendo las asignaturas '
        +
        'perdidas. Comité Asesor asigna créditos a las que no tengan equivalencias '
        +
        '(Artículo 3, {}). Universitas y SIA: Pérdida de calidad de estudiante al '
        + 'finalizar {} por {}',
        '{}iene PAPA superior o igual a 2.7 (literal 3b – Artículo 3, {}; Artículo 46, '
        + '{}). SIA: PAPA de {}.',
        '{}ispone de un cupo suficiente de créditos: Cupo adicional de 10 créditos a lo sumo '
        +
        '(parágrafo 1 Artículo 46, {}). SIA: {} creditos. En caso de otorgarle un cupo adicional '
        +
        'de créditos, éste no podrá ser mayor que el requerido para inscribir las asignaturas '
        + 'pendientes del plan de estudios. (Artículo 6, {}).',
        'La solicitud {}se hace en fechas de calendario de sede.'
    ]

    str_pcm_pre_acadinfo = [
        'Periodo para el cual fue admitido en este plan de estudios',
        '¿Se trata de un primer reingreso?',
        'Si la respuesta es NO, el Comité Asesor no debe recomendar al Consejo '
        + 'de Facultad el reingreso',
        'Es caso de ser primer reingreso en ¿qué periodo académico perdió la '
        + 'calidad de estudiante?',
        'Al momento de presentar la solicitud ¿cuántos periodos académicos (incluido'
        +
        ' el periodo académico en que presentó la solicitud) han transcurridos a partir'
        + ' del periodo académico en que registró su última matrícula?',
        'En caso que la respuesta sea mayor de 6 periodos académicos no se debe '
        + 'recomendar el reingreso',
        'P.A.P.A.',
        'Causa de la pérdida de la calidad de estudiante',
        'Estudio de créditos',
        'Cupo de créditos menos créditos pendientes',
        'Créditos pendientes por ser aprobados del plan de estudios',
        'Créditos pendientes por ser aprobados de nivelación – Inglés',
        '¿Cuántos créditos adicionales requiere para inscribir asignaturas?',
        # Optional: Grade needed with N credits to keep student condition.
        'Al finalizar el semestre de reingreso para mantener la calidad de estudiante,'
        + ' deberá obtener un promedio semestral mínimo de:',
        'Si inscribe 12 Créditos',
        'Si inscribe 15 Créditos',
        'Si inscribe 18 Créditos',
        'Si inscribe 21 Créditos'
    ]

    str_out_date = [
        'reingreso por única vez a partir del periodo académico {}, porque el estudiante '
        +
        'presentó la solicitud fuera de las fechas establecidas en el Calendario Académico '
        + 'de la Sede Bogotá.'
    ]

    def rein_general_data_table(self, docx):
        # pylint: disable=no-member
        general_data = [
            ['Estudiante', self.student_name], ['DNI', self.student_dni],
            ['Plan de estudios',
             self.get_academic_program_display()],
            ['Código del plan de estudios', self.academic_program],
            ['Fecha de la solicitud',
             string_to_date(str(self.date))]
        ]

        case = 'REINGRESO'

        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        bullet = paragraph.add_run(self.str_pcm_pre[2])
        bullet.font.bold = True
        bullet.font.size = Pt(8)

        table_general_data(general_data, case, docx)

    def rein_academic_info(self, docx):
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        bullet = paragraph.add_run(self.str_pcm_pre[3])
        bullet.font.bold = True
        bullet.font.size = Pt(8)

        table = docx.add_table(rows=13, cols=3)
        table.style = 'Table Grid'
        table.style.font.size = Pt(8)
        table.alignment = WD_ALIGN_PARAGRAPH.CENTER
        for cell in table.columns[0].cells:
            cell.width = 400000
        for cell in table.columns[1].cells:
            cell.width = 3200000
        for cell in table.columns[2].cells:
            cell.width = 1600000
        table.columns[0].width = 400000
        table.columns[1].width = 3200000
        table.columns[2].width = 1600000
        table.cell(0, 0).merge(table.cell(0, 1)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[0])
        table.cell(0, 2).paragraphs[0].add_run(self.admission_period)
        table.cell(0, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(1, 0).merge(table.cell(1, 1)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[1])

        if self.first_reing:
            table.cell(1, 2).paragraphs[0].add_run('Sí')
        else:
            table.cell(1, 2).paragraphs[0].add_run('No')

        table.cell(1, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(2, 0).merge(table.cell(2, 2)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[2])
        table.cell(3, 0).merge(table.cell(3, 1)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[3])
        table.cell(3, 2).paragraphs[0].add_run(self.loss_period)
        table.cell(3, 2).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
        table.cell(3, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(4, 0).merge(table.cell(4, 1)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[4])
        table.cell(4, 2).paragraphs[0].add_run(str(self.periods_since))
        table.cell(4, 2).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
        table.cell(4, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(5, 0).merge(table.cell(5, 2)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[5])
        table.cell(6, 0).merge(table.cell(6, 1)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[6])
        table.cell(6, 2).paragraphs[0].add_run(str(self.papa))
        table.cell(6, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(7, 0).merge(table.cell(7, 1)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[7])
        table.cell(7, 0).merge(table.cell(
            7, 1)).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
        table.cell(7, 2).paragraphs[0].add_run(
            # pylint: disable=no-member
            self.get_reason_of_loss_display())
        table.cell(7, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(8, 0).merge(table.cell(8, 2)).paragraphs[0].add_run(
            self.str_pcm_pre_acadinfo[8]).font.bold = True
        table.cell(9, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(9, 0).paragraphs[0].add_run('1').font.bold = True
        table.cell(10, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(10, 0).paragraphs[0].add_run('2').font.bold = True
        table.cell(11, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(11, 0).paragraphs[0].add_run('3').font.bold = True
        table.cell(12, 0).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(12, 0).paragraphs[0].add_run('4').font.bold = True
        table.cell(9, 1).paragraphs[0].add_run(self.str_pcm_pre_acadinfo[9])
        table.cell(10, 1).paragraphs[0].add_run(self.str_pcm_pre_acadinfo[10])
        table.cell(11, 1).paragraphs[0].add_run(self.str_pcm_pre_acadinfo[11])
        table.cell(12, 1).paragraphs[0].add_run(self.str_pcm_pre_acadinfo[12])
        table.cell(9,
                   2).paragraphs[0].add_run(str(self.credits_minus_remaining))
        table.cell(9, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(10, 2).paragraphs[0].add_run(str(self.credits_remaining))
        table.cell(10, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(11, 2).paragraphs[0].add_run(str(self.credits_english))
        table.cell(11, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        table.cell(12, 2).paragraphs[0].add_run(str(self.credits_add))
        table.cell(12, 2).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

        # Optional: Grade needed with N credits to keep student condition.
        if self.reason_of_loss == self.RL_ANSWER_CUPO_CREDITOS:
            table = docx.add_table(rows=5, cols=2)
            for col in table.columns:
                for cell in col.cells:
                    cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
            table.style = 'Table Grid'
            table.style.font.size = Pt(8)
            table.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for cell in table.columns[0].cells:
                cell.width = 3100000
            for cell in table.columns[1].cells:
                cell.width = 2100000
            table.columns[0].width = 3100000
            table.columns[1].width = 2100000
            table.cell(0, 0).merge(table.cell(
                0, 1)).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.LEFT
            table.cell(0, 0).merge(table.cell(0, 1)).paragraphs[0].add_run(
                self.str_pcm_pre_acadinfo[13])
            table.cell(1,
                       0).paragraphs[0].add_run(self.str_pcm_pre_acadinfo[14])
            table.cell(2,
                       0).paragraphs[0].add_run(self.str_pcm_pre_acadinfo[15])
            table.cell(3,
                       0).paragraphs[0].add_run(self.str_pcm_pre_acadinfo[16])
            table.cell(4,
                       0).paragraphs[0].add_run(self.str_pcm_pre_acadinfo[17])
            table.cell(1, 1).paragraphs[0].add_run(str(self.min_grade_12c))
            table.cell(2, 1).paragraphs[0].add_run(str(self.min_grade_15c))
            table.cell(3, 1).paragraphs[0].add_run(str(self.min_grade_18c))
            table.cell(4, 1).paragraphs[0].add_run(str(self.min_grade_21c))

    def rein_credits_summary(self, docx):
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        bullet = paragraph.add_run(self.str_pcm_pre[4])
        bullet.font.bold = True
        bullet.font.size = Pt(8)

        credits_data = [[
            self.exi_fund_m, self.exi_fund_o, self.exi_disc_m, self.exi_disc_o,
            self.exi_free
        ],
                        [
                            self.app_fund_m, self.app_fund_o, self.app_disc_m,
                            self.app_disc_o, self.app_free
                        ],
                        [
                            self.rem_fund_m, self.rem_fund_o, self.rem_disc_m,
                            self.rem_disc_o, self.rem_free
                        ]]
        case = 'REINGRESO'
        table_credits_summary(docx, credits_data, case)

        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        bullet = paragraph.add_run(self.str_pcm_pre[5])
        bullet.font.size = Pt(8)

    def rein_recommends(self, docx):
        details = []
        details.append(
            # pylint: disable=no-member
            self.get_academic_program_display())

        # Migrate to case_utils?
        year = str(self.comitee_date)[0:4]
        month = str(self.comitee_date)[5:7]
        day = str(self.comitee_date)[8:10]
        details.append(day + '-' + month + '-' + year)
        details.append(self.comitee_act)
        details.append(str(self.comitee_date)[0:4])
        if self.advisor_response == self.ARCR_APROBAR:
            details.append(True)
        else:
            details.append(False)
        table_recommend(docx, details)

    def extra_credits(self, paragraph):
        paragraph.add_run(self.str_pcm_pre[18] + str(self.credits_granted) +
                          self.str_pcm_pre[19])

    def get_analysis(self):
        analysis = []
        modifier = 'No h' if self.first_reing else 'H'
        analysis.append(self.str_analysis[0].format(
            modifier, self.regulations['008|2008|CSU'][0]))
        analysis.append(self.str_analysis[1].format(
            self.regulations['239|2009|VAC'][0],
            # pylint: disable=no-member
            self.loss_period,
            self.get_reason_of_loss_display()))
        modifier = 'T' if self.papa >= 2.7 else 'No t'
        analysis.append(self.str_analysis[2].format(
            modifier, self.regulations['239|2009|VAC'][0],
            self.regulations['008|2008|CSU'][0], self.papa))
        modifier = 'D' if self.credits_remaining > 0 else 'No d'
        analysis.append(self.str_analysis[3].format(
            modifier, self.regulations['008|2008|CSU'][0],
            self.credits_remaining, self.regulations['012|2014|VAC'][0]))
        modifier = '' if self.request_in_date else 'no '
        analysis.append(self.str_analysis[4].format(modifier))
        return analysis + self.extra_analysis

    def pcm(self, docx):
        add_analysis_paragraph(docx, self.get_analysis())
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        self.pcm_answer(paragraph)
        #if self.request_in_date: To ommit tables when the request isn't in time
        self.cm_pcm_paragraph(docx)
        self.rein_general_data_table(docx)
        self.rein_academic_info(docx)
        self.rein_credits_summary(docx)
        self.rein_recommends(docx)

    def cm(self, docx):
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        #if self.request_in_date: To ommit tables when the request isn't in time
        self.cm_answer(paragraph)
        self.rein_general_data_table(docx)
        self.rein_academic_info(docx)
        self.rein_credits_summary(docx)
        self.rein_recommends(docx)

    def pcm_answer(self, paragraph):
        paragraph.add_run(self.str_answer + ':\n').font.bold = True
        paragraph.add_run(self.str_comittee_header + ' ')
        paragraph.add_run(
            # pylint: disable=no-member
            self.get_approval_status_display().upper() + ' ').font.bold = True
        if not self.request_in_date:
            self.out_of_date_answer(paragraph)
        else:
            aff = self.is_affirmative_response_advisor_response()
            self.standard_answer(paragraph, aff)

    def cm_pcm_paragraph(self, docx):
        if not self.request_in_date:
            return  # Skip when it's out of date
        para = docx.add_paragraph()
        para.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        para.paragraph_format.space_after = Pt(0)
        para.add_run(self.str_pcm_pre[6] + self.student_name +
                     self.str_pcm_pre[7] + str(self.credits_remaining))
        para.add_run(self.str_pcm_pre[8] +
                     # pylint: disable=no-member
                     self.get_academic_program_display())
        para.add_run(self.str_pcm_pre[9] + str(self.credits_english) +
                     self.str_pcm_pre[10])
        para.add_run(self.str_pcm_pre[11])
        para.add_run(str(self.credits_remaining +
                         self.credits_minus_remaining))
        para.add_run(self.str_pcm_pre[12])
        para = docx.add_paragraph()
        para.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        para.paragraph_format.space_after = Pt(0)
        para.add_run(self.str_pcm_pre[13] +
                     self.regulations['008|2008|CSU'][0])
        para.add_run(self.str_pcm_pre[14])
        para.add_run(self.str_pcm_pre[15]).font.italic = True
        para.add_run(self.str_pcm_pre[16] + str(self.credits_granted))
        para.add_run(self.str_pcm_pre[17])
        para.add_run(
            # pylint: disable=no-member
            self.get_academic_program_display() + '.')

    def cm_answer(self, paragraph):
        paragraph.add_run(self.str_council_header + ' ')
        paragraph.add_run(
            # pylint: disable=no-member
            self.get_approval_status_display().upper() + ' ').font.bold = True
        aff = self.is_affirmative_response_approval_status()
        self.standard_answer(paragraph, aff)

    def standard_answer(self, paragraph, affirmative):

        paragraph.add_run(self.str_pcm_pre[0])
        paragraph.add_run(self.academic_period + ' ')

        if self.credits_granted > 0:
            # Y otorga n créditos adicionales:
            self.extra_credits(paragraph)

        if affirmative:
            paragraph.add_run(self.str_pcm_pre[1])
        else:
            paragraph.add_run(self.council_decision + '.')

        paragraph.add_run('({}).'.format(self.regulations['012|2014|VAC'][0] +
                                         "; Artículo 46, " +
                                         self.regulations['008|2008|CSU'][0]))

    def out_of_date_answer(self, paragraph):
        paragraph.add_run(self.str_out_date[0].format(self.reing_period))
Esempio n. 16
0
class EMCA(Request):

    full_name = 'Exención de matrícula por consideración atípica'

    percentage = FloatField(
        min_value=0.0,
        max_value=100.0,
        required=True,
        display='Porcentaje de exención del valor de la matrícula',
        default=0.0)
    academic_period_exe = StringField(max_length=10,
                                      display='Periodo de exención',
                                      choices=Request.PERIOD_CHOICES,
                                      default=Request.PERIOD_DEFAULT)
    ha_active = BooleanField(default=True,
                             display='¿Tiene la historia académica activa?')

    regulation_list = ['070|2009|CAC']  # List of regulations

    str_cm = [
        ' otorgrar exención del pago de {}% del valor de la matrícula para el periodo '
        + 'académico {}, ', ' ({}).'
    ]

    str_analysis = ['iene la historia académica activa.']

    list_analysis = []

    def cm(self, docx):
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        self.cm_answer(paragraph)

    def cm_answer(self, paragraph):
        # pylint: disable=no-member
        paragraph.add_run(self.str_council_header + ' ')
        paragraph.add_run(self.get_approval_status_display().upper() +
                          ' ').font.bold = True
        paragraph.add_run(self.str_cm[0].format(self.percentage,
                                                self.academic_period_exe))
        paragraph.add_run(self.council_decision)
        paragraph.add_run(self.str_cm[1].format(
            Request.regulations['070|2009|CAC'][0]))

    def pcm(self, docx):
        self.pcm_analysis(docx)
        self.pcm_answer(docx)

    def pcm_answer(self, docx):
        # pylint: disable=no-member
        paragraph = docx.add_paragraph()
        paragraph.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
        paragraph.paragraph_format.space_after = Pt(0)
        paragraph.add_run(self.str_answer + ': ').font.bold = True
        paragraph.add_run(self.str_comittee_header + ' ')
        paragraph.add_run(
            self.get_advisor_response_display().upper()).font.bold = True
        paragraph.add_run(self.str_cm[0].format(self.percentage,
                                                self.academic_period_exe))
        paragraph.add_run(self.council_decision)
        paragraph.add_run(self.str_cm[1].format(
            Request.regulations['070|2009|CAC'][0]))

    def pcm_analysis(self, docx):
        final_analysis = []
        aux = 'T' if self.ha_active else 'No t'
        final_analysis += [aux + self.str_analysis[0]]
        for extra_a in self.extra_analysis:
            final_analysis += [extra_a]
        add_analysis_paragraph(docx, final_analysis)
Esempio n. 17
0
class NetworkModel(Document):
    track_length = IntField(required=True)
    track_time = FloatField(required=True)
    history = DictField(required=False)
    model_filename = StringField(required=False)
    model_file = FileField(required=False)
    hiperparams_opt = BooleanField(default=False)
    keras_model = None

    # Net params define optimal setup. Analysis params is for optimization
    params_training = DictField(required=False)
    analysis_params = {}

    meta = {'allow_inheritance': True}

    def __init__(self, *args, **values):
        super().__init__(*args, **values)
        if self.id is None:
            self.save()
        self.model_filename = ''.join(['Models/', str(self.id)])

    def train_network(self):
        pass

    def evaluate_track_input(self, track):
        pass

    def validate_test_data_accuracy(self, n_axes, normalized=True):
        pass

    def validate_test_data_mse(self, n_axes):
        pass

    def build_model(self):
        pass

    def convert_history_to_db_format(self, history_training):
        for k, v in history_training.history.items():
            for i in range(len(history_training.history[k])):
                history_training.history[k][i] = float(history_training.history[k][i])
        self.history = history_training.history

    def load_model_from_file(self, only_local_files=False):
        load_success = False
        try:
            self.keras_model = load_model(self.model_filename, compile=True)
            load_success = True
        except (ValueError, OSError) as e:
            if not only_local_files:
                try:
                    print("Local model not available, loading from db")
                    self.keras_model = self.build_model()
                    weights = pickle.loads(self.model_file.read())
                    if weights is not None and self.keras_model is not None:
                        self.keras_model.set_weights(weights)
                        load_success = True
                    else:
                        raise TypeError

                except TypeError:
                    print("Weights not available in DB")
        return load_success

    def save_model_file_to_db(self):
        self.model_file.put(pickle.dumps(self.keras_model.get_weights()))

    def update_model_file_to_db(self):
        self.model_file.replace(pickle.dumps(self.keras_model.get_weights()))

    def plot_loss_model(self, train=True, val=True):
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        if train:
            plt.plot(np.arange(1, len(self.history['loss']) + 1, 1), self.history['loss'], label="Train loss")
        if val:
            plt.plot(np.arange(1, len(self.history['val_loss']) + 1, 1), self.history['val_loss'], label="Val loss")
        plt.legend()
        plt.show()

    def plot_mse_model(self, train=True, val=True):
        plt.xlabel('Epoch')
        plt.ylabel('MSE')
        if train:
            plt.plot(np.arange(1, len(self.history['mse']) + 1, 1), self.history['mse'], label="Train mse")
        if val:
            plt.plot(np.arange(1, len(self.history['val_mse']) + 1, 1), self.history['val_mse'], label="Val mse")
        # plt.legend()
        plt.show()

    def plot_accuracy_model(self, train=True, val=True, categorical=False):
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        plt.title('Model Accuracy')
        if categorical:
            if train:
                plt.plot(np.arange(1, len(self.history['categorical_accuracy']) + 1, 1),
                         self.history['categorical_accuracy'], label="Train categorical accuracy")
            if val:
                plt.plot(np.arange(1, len(self.history['val_categorical_accuracy']) + 1, 1),
                         self.history['val_categorical_accuracy'], label="Val categorical accuracy")
        else:
            if train:
                plt.plot(np.arange(1, len(self.history['acc']) + 1, 1), self.history['acc'],
                         label="Train accuracy")
            if val:
                plt.plot(np.arange(1, len(self.history['val_acc']) + 1, 1), self.history['val_acc'],
                         label="Val accuracy")

        plt.legend()
        plt.show()

    def is_valid_network_track_time(self, track_time):
        if (self.track_time * 0.85) <= track_time <= (self.track_time * 1.15):
            return True
        else:
            return False
Esempio n. 18
0
class Country(Document):
    name = StringField(required=True, primary_key=True)
    code = StringField()
    population = IntField()
    area = IntField()
    pop_density = FloatField()
    life_expectancy = FloatField()
    gdp = FloatField()
    gdp_growth = FloatField()
    poverty = FloatField()
    literacy = FloatField()
    birth_rate = FloatField()
    death_rate = FloatField()
    co2_emissions = FloatField()

    happiness_score = FloatField()
    happiness_rank = IntField()

    hdi_score = FloatField()
    hdi_rank = IntField()

    def __init__(self,
                 name,
                 code,
                 population,
                 area,
                 pop_density,
                 life_expectancy,
                 gdp,
                 gdp_growth,
                 poverty,
                 literacy,
                 birth_rate,
                 death_rate,
                 co2_emissions,
                 happiness_score=None,
                 happiness_rank=None,
                 hdi_score=None,
                 hdi_rank=None,
                 *args,
                 **kwargs):
        super().__init__(*args, **kwargs)
        self.name = name
        self.code = code
        self.population = population
        self.area = area
        self.pop_density = pop_density
        self.life_expectancy = life_expectancy
        self.gdp = gdp
        self.gdp_growth = gdp_growth
        self.poverty = poverty
        self.literacy = literacy
        self.birth_rate = birth_rate
        self.death_rate = death_rate
        self.co2_emissions = co2_emissions
        self.happiness_score = happiness_score
        self.happiness_rank = happiness_rank
        self.hdi_score = hdi_score
        self.hdi_rank = hdi_rank
Esempio n. 19
0
class MachineEngineSettings(EmbeddedDocument):
    _key_brand = ReferenceField(Brand, required=True)
    motor_gucu = FloatField(required=True)
Esempio n. 20
0
class EncodeStream(Stream):
    def __init__(self, *args, **kwargs):
        super(EncodeStream, self).__init__(*args, **kwargs)

    deinterlace = BooleanField(default=constants.DEFAULT_DEINTERLACE, required=True)
    frame_rate = IntField(default=constants.INVALID_FRAME_RATE, required=True)
    volume = FloatField(default=constants.DEFAULT_VOLUME, required=True)
    video_codec = StringField(default=constants.DEFAULT_VIDEO_CODEC, required=True)
    audio_codec = StringField(default=constants.DEFAULT_AUDIO_CODEC, required=True)
    audio_channels_count = IntField(default=constants.INVALID_AUDIO_CHANNELS_COUNT, required=True)
    size = EmbeddedDocumentField(Size, default=Size())
    video_bit_rate = IntField(default=constants.INVALID_VIDEO_BIT_RATE, required=True)
    audio_bit_rate = IntField(default=constants.INVALID_AUDIO_BIT_RATE, required=True)
    logo = EmbeddedDocumentField(Logo, default=Logo())
    aspect_ratio = EmbeddedDocumentField(Rational, default=Rational())

    def get_type(self):
        return constants.StreamType.ENCODE

    def config(self) -> dict:
        conf = super(EncodeStream, self).config()
        conf[DEINTERLACE_FIELD] = self.get_deinterlace()
        frame_rate = self.get_frame_rate()
        if frame_rate != constants.INVALID_FRAME_RATE:
            conf[FRAME_RATE_FIELD] = frame_rate
        conf[VOLUME_FIELD] = self.get_volume()
        conf[VIDEO_CODEC_FIELD] = self.get_video_codec()
        conf[AUDIO_CODEC_FIELD] = self.get_audio_codec()
        audio_channels = self.get_audio_channels_count()
        if audio_channels != constants.INVALID_AUDIO_CHANNELS_COUNT:
            conf[AUDIO_CHANNELS_COUNT_FIELD] = audio_channels

        if self.size.is_valid():
            conf[SIZE_FIELD] = str(self.size)

        vid_rate = self.get_video_bit_rate()
        if vid_rate != constants.INVALID_VIDEO_BIT_RATE:
            conf[VIDEO_BIT_RATE_FIELD] = vid_rate
        audio_rate = self.get_audio_bit_rate()
        if audio_rate != constants.INVALID_AUDIO_BIT_RATE:
            conf[AUDIO_BIT_RATE_FIELD] = self.get_audio_bit_rate()
        if self.logo.is_valid():
            conf[LOGO_FIELD] = self.logo.to_dict()
        if self.aspect_ratio.is_valid():
            conf[ASPCET_RATIO_FIELD] = str(self.aspect_ratio)
        return conf

    def get_deinterlace(self):
        return self.deinterlace

    def get_frame_rate(self):
        return self.frame_rate

    def get_volume(self):
        return self.volume

    def get_video_codec(self):
        return self.video_codec

    def get_audio_codec(self):
        return self.audio_codec

    def get_audio_channels_count(self):
        return self.audio_channels_count

    def get_video_bit_rate(self):
        return self.video_bit_rate

    def get_audio_bit_rate(self):
        return self.audio_bit_rate
Esempio n. 21
0
class DbBarData(Document):
    """
    Candlestick bar data for database storage.

    Index is defined unique with datetime, interval, symbol
    """

    symbol: str = StringField()
    exchange: str = StringField()
    datetime: datetime = DateTimeField()
    interval: str = StringField()

    volume: float = FloatField()
    open_price: float = FloatField()
    open_interest: float = FloatField()
    high_price: float = FloatField()
    low_price: float = FloatField()
    close_price: float = FloatField()

    build_time: datetime = DateTimeField()
    remove_time: datetime = DateTimeField()

    # 在集合上指定索引以加快查询速度。这是通过创建indexes在
    # meta字典中调用的索引规范列表完成的,
    # 其中索引规范可以是单个字段名称,
    # 包含多个字段名称的元组或包含完整索引定义的字典。
    meta = {
        "indexes": [{
            "fields": ("datetime", "interval", "symbol", "exchange"),
            "unique": True,
        }]
    }

    @staticmethod
    def from_bar(bar: BarData):
        """
        Generate DbBarData object from BarData.
        """
        db_bar = DbBarData()

        db_bar.symbol = bar.symbol
        db_bar.exchange = bar.exchange.value
        db_bar.datetime = bar.datetime
        db_bar.interval = bar.interval.value
        db_bar.volume = bar.volume
        db_bar.open_price = bar.open_price
        db_bar.high_price = bar.high_price
        db_bar.low_price = bar.low_price
        db_bar.close_price = bar.close_price
        db_bar.open_interest = bar.open_interest
        db_bar.build_time = bar.build_time
        db_bar.remove_time = bar.remove_time
        return db_bar

    def to_bar(self):
        """
        Generate BarData object from DbBarData.
        """
        bar = BarData(
            symbol=self.symbol,
            exchange=Exchange(self.exchange),
            datetime=self.datetime,
            interval=Interval(self.interval),
            volume=self.volume,
            open_price=self.open_price,
            open_interest=self.open_interest,
            high_price=self.high_price,
            low_price=self.low_price,
            close_price=self.close_price,
            build_time=self.build_time,
            remove_time=self.remove_time,
            gateway_name="DB",
        )
        return bar
Esempio n. 22
0
class Configuration(EmbeddedDocument):
    is_valid = BooleanField(default=False, required=True, null=False)
    method = StringField(null=False,
                         required=True,
                         choices=('Li98', 'Kirkaldy83'))
    grain_size = FloatField(null=False, required=True, validation=not_negative)
    nucleation_start = FloatField(null=False,
                                  required=True,
                                  validation=within_percentage_bounds)
    nucleation_finish = FloatField(null=False,
                                   required=True,
                                   validation=within_percentage_bounds)
    auto_calculate_ms = BooleanField(default=True, null=False, required=True)
    auto_calculate_bs = BooleanField(default=True, null=False, required=True)
    auto_calculate_ae = BooleanField(default=True, null=False, required=True)
    ms_temp = FloatField(default=0.0,
                         null=False,
                         required=True,
                         validation=not_negative)
    ms_rate_param = FloatField(default=0.0,
                               null=False,
                               required=True,
                               validation=not_negative)
    bs_temp = FloatField(default=0.0,
                         null=False,
                         required=True,
                         validation=not_negative)
    ae1_temp = FloatField(default=0.0,
                          null=False,
                          required=True,
                          validation=not_negative)
    ae3_temp = FloatField(default=0.0,
                          null=False,
                          required=True,
                          validation=not_negative)
    start_temp = FloatField(default=900,
                            null=False,
                            required=True,
                            validation=not_negative)
    cct_cooling_rate = FloatField(default=10,
                                  null=False,
                                  required=True,
                                  validation=not_negative)

    def to_dict(self) -> dict:
        """
        Simple EmbeddedDocument.Configuration helper method to get a Python dict
        """
        return {
            'is_valid': self.is_valid,
            'method': self.method,
            'grain_size': self.grain_size,
            'nucleation_start': self.nucleation_start,
            'nucleation_finish': self.nucleation_finish,
            'auto_calculate_ms': self.auto_calculate_ms,
            'auto_calculate_bs': self.auto_calculate_bs,
            'auto_calculate_ae': self.auto_calculate_ae,
            'ms_temp': self.ms_temp,
            'ms_rate_param': self.ms_rate_param,
            'bs_temp': self.bs_temp,
            'ae1_temp': self.ae1_temp,
            'ae3_temp': self.ae3_temp,
            'start_temp': self.start_temp,
            'cct_cooling_rate': self.cct_cooling_rate
        }

    # noinspection PyMethodParameters
    @queryset_manager
    def as_dict(cls, queryset) -> list:
        """Adding an additional QuerySet context method to return a list of
        `sim_api.models.Configuration` Documents instead of a QuerySet.

        Usage:
            config_list = Configuration.as_dict()

        Args:
            queryset: the queryset that must is accepted as part of the Mongo
                      BSON parameter.

        Returns:
            A list with every Configuration Document object converted to dict.
        """
        return [obj.to_dict() for obj in queryset]

    def __str__(self):
        return self.to_json()
Esempio n. 23
0
class EntriesDocument(VespaDocument):

    indexes = [
        'journal',
        'journal_short',
        'publication_date',
        'has_full_text',
        'origin',
        'last_updated',
        'has_year',
        'has_month',
        'has_day',
        'is_preprint',
        'is_covid19',
        'cord_uid',
        'who_covidence',
        'version',
        'copyright',
        'document_type',
        {
            "fields": [
                "doi",
            ],
            "unique": True,
            "partialFilterExpression": {
                "doi": {
                    "$type": "string"
                }
            }
        },
        {
            "fields": [
                "#title",
            ]
        },
        {
            "fields": [
                "pmcid",
            ],
            "unique": True,
            "partialFilterExpression": {
                "pmcid": {
                    "$type": "string"
                }
            }
        },
        {
            "fields": [
                "pubmed_id",
            ],
            "unique": True,
            "partialFilterExpression": {
                "pubmed_id": {
                    "$type": "string"
                }
            }
        },
        {
            "fields": [
                "scopus_eid",
            ],
            "unique": True,
            "partialFilterExpression": {
                "scopus_eid": {
                    "$type": "string"
                }
            }
        },
        {
            "fields": [
                "hashed_title",
            ],
            "unique": True,
            "partialFilterExpression": {
                "hashed_title": {
                    "$type": "string"
                }
            }
        },
    ]
    meta = {
        "collection": "entries_vespa2",
        "indexes": indexes,
        "allow_inheritance": False
    }

    source_documents = ListField(GenericReferenceField(), required=True)
    embeddings = DictField(default={})
    is_covid19_ML = FloatField()
    keywords_ML = ListField(StringField(required=True), default=lambda: [])
    synced = BooleanField(default=False)
    #Titles are be default too long for a unique index, so we have to hash them
    hashed_title = StringField(default=None)
    last_twitter_search = DateTimeField()
    tweets = ListField(ReferenceField(TweetDocument))
    altmetric = DynamicField()
Esempio n. 24
0
class RedditPost(Document):
    post_id = StringField()
    created = FloatField()
    title = StringField()
    text = StringField()
Esempio n. 25
0
class Body(EmbeddedDocument):
    body_id = LongField(required=True)
    width = IntField(min_value=0, required=True)
    height = IntField(min_value=0, required=True)
    sharpness = FloatField(min_value=0, required=True)
Esempio n. 26
0
class RedditComment(Document):
    comment_id = StringField()
    created = FloatField()
    link_id = StringField()
    text = StringField()
Esempio n. 27
0
class DbTickData(Document):
    """
    Tick data for database storage.

    Index is defined unique with (datetime, symbol)
    """

    symbol: str = StringField()
    exchange: str = StringField()
    datetime: datetime = DateTimeField()

    name: str = StringField()
    volume: float = FloatField()
    open_interest: float = FloatField()
    last_price: float = FloatField()
    last_volume: float = FloatField()
    limit_up: float = FloatField()
    limit_down: float = FloatField()

    open_price: float = FloatField()
    high_price: float = FloatField()
    low_price: float = FloatField()
    close_price: float = FloatField()
    pre_close: float = FloatField()

    bid_price_1: float = FloatField()
    bid_price_2: float = FloatField()
    bid_price_3: float = FloatField()
    bid_price_4: float = FloatField()
    bid_price_5: float = FloatField()

    ask_price_1: float = FloatField()
    ask_price_2: float = FloatField()
    ask_price_3: float = FloatField()
    ask_price_4: float = FloatField()
    ask_price_5: float = FloatField()

    bid_volume_1: float = FloatField()
    bid_volume_2: float = FloatField()
    bid_volume_3: float = FloatField()
    bid_volume_4: float = FloatField()
    bid_volume_5: float = FloatField()

    ask_volume_1: float = FloatField()
    ask_volume_2: float = FloatField()
    ask_volume_3: float = FloatField()
    ask_volume_4: float = FloatField()
    ask_volume_5: float = FloatField()

    meta = {
        "indexes": [
            {
                "fields": ("symbol", "exchange", "datetime"),
                "unique": True,
            }
        ],
    }

    @staticmethod
    def from_tick(tick: TickData):
        """
        Generate DbTickData object from TickData.
        """
        db_tick = DbTickData()

        db_tick.symbol = tick.symbol
        db_tick.exchange = tick.exchange.value
        db_tick.datetime = tick.datetime
        db_tick.name = tick.name
        db_tick.volume = tick.volume
        db_tick.open_interest = tick.open_interest
        db_tick.last_price = tick.last_price
        db_tick.last_volume = tick.last_volume
        db_tick.limit_up = tick.limit_up
        db_tick.limit_down = tick.limit_down
        db_tick.open_price = tick.open_price
        db_tick.high_price = tick.high_price
        db_tick.low_price = tick.low_price
        db_tick.pre_close = tick.pre_close

        db_tick.bid_price_1 = tick.bid_price_1
        db_tick.ask_price_1 = tick.ask_price_1
        db_tick.bid_volume_1 = tick.bid_volume_1
        db_tick.ask_volume_1 = tick.ask_volume_1

        if tick.bid_price_2:
            db_tick.bid_price_2 = tick.bid_price_2
            db_tick.bid_price_3 = tick.bid_price_3
            db_tick.bid_price_4 = tick.bid_price_4
            db_tick.bid_price_5 = tick.bid_price_5

            db_tick.ask_price_2 = tick.ask_price_2
            db_tick.ask_price_3 = tick.ask_price_3
            db_tick.ask_price_4 = tick.ask_price_4
            db_tick.ask_price_5 = tick.ask_price_5

            db_tick.bid_volume_2 = tick.bid_volume_2
            db_tick.bid_volume_3 = tick.bid_volume_3
            db_tick.bid_volume_4 = tick.bid_volume_4
            db_tick.bid_volume_5 = tick.bid_volume_5

            db_tick.ask_volume_2 = tick.ask_volume_2
            db_tick.ask_volume_3 = tick.ask_volume_3
            db_tick.ask_volume_4 = tick.ask_volume_4
            db_tick.ask_volume_5 = tick.ask_volume_5

        return db_tick

    def to_tick(self):
        """
        Generate TickData object from DbTickData.
        """
        tick = TickData(
            symbol=self.symbol,
            exchange=Exchange(self.exchange),
            datetime=self.datetime,
            name=self.name,
            volume=self.volume,
            open_interest=self.open_interest,
            last_price=self.last_price,
            last_volume=self.last_volume,
            limit_up=self.limit_up,
            limit_down=self.limit_down,
            open_price=self.open_price,
            high_price=self.high_price,
            low_price=self.low_price,
            pre_close=self.pre_close,
            bid_price_1=self.bid_price_1,
            ask_price_1=self.ask_price_1,
            bid_volume_1=self.bid_volume_1,
            ask_volume_1=self.ask_volume_1,
            gateway_name="DB",
        )

        if self.bid_price_2:
            tick.bid_price_2 = self.bid_price_2
            tick.bid_price_3 = self.bid_price_3
            tick.bid_price_4 = self.bid_price_4
            tick.bid_price_5 = self.bid_price_5

            tick.ask_price_2 = self.ask_price_2
            tick.ask_price_3 = self.ask_price_3
            tick.ask_price_4 = self.ask_price_4
            tick.ask_price_5 = self.ask_price_5

            tick.bid_volume_2 = self.bid_volume_2
            tick.bid_volume_3 = self.bid_volume_3
            tick.bid_volume_4 = self.bid_volume_4
            tick.bid_volume_5 = self.bid_volume_5

            tick.ask_volume_2 = self.ask_volume_2
            tick.ask_volume_3 = self.ask_volume_3
            tick.ask_volume_4 = self.ask_volume_4
            tick.ask_volume_5 = self.ask_volume_5

        return tick
Esempio n. 28
0
class RedditUser(Document):
    uname = StringField()
    latest_comment = FloatField()
    latest_post = FloatField()
    comments = ListField(ReferenceField('RedditComment'))
    posts = ListField(ReferenceField('RedditPost'))
Esempio n. 29
0
class Worker(Document):
    username = EmbeddedDocumentField(WorkerHandles)
    reputation = FloatField(default=1)
    email = EmailField()
    credits = FloatField(default=0)
    properties = EmbeddedDocumentField(WorkerProperties)
Esempio n. 30
0
class Feedback(Document):
    rating = FloatField(required=True)
    scale = FloatField(default=5.0)
    feedback = StringField(default=None)
    user = StringField(required=True)
    timestamp = DateTimeField(default=datetime.utcnow)