예제 #1
0
    async def post_poll(model: RequestPoll, user=Depends(
            authenticator.get_current_superuser)):
        inserted = []

        for question in model.questions:
            uuid: Binary = generate_uuid()
            created_at: datetime = datetime.utcnow()
            ngram_forms = [x['value'] for x in question.forms if x]

            question_doc: Question = {
                '_id': uuid,
                'user_id': user.id,
                'created_at': created_at,
                'question': question.question,
                'forms': question.forms,
                'type': question.type,
                'ngrams': make_ngrams([question.question, ngram_forms])
            }

            res = await database['questions'].insert_one(question_doc)

            if res.acknowledged:
                inserted.append(UUID(bytes=res.inserted_id))

        if len(inserted) > 0:
            document = {'_id': generate_uuid(), 'questions': inserted}
            await database['polls'].insert_one(document)
예제 #2
0
    async def patch_vote(hex, model: RequestVote, user=Depends(
            authenticator.get_current_active_user)):
        try:
            req_uuid = UUID(hex=hex, version=4)
        except (TypeError, ValueError):
            raise HTTPException(
                status_code=404, detail='Invalid identifier')
        d = dict(model)
        inserted = []
        updated = []

        if d['reply'] == 'undefined':
            raise HTTPException(
                status_code=400, detail='Invalid option provided')

        document = {'$set': d}
        query = {'question_id': req_uuid,
                 'option_id': d['reply'][0], 'user_id': user.id}

        res = await database['votes'].update_one(query, document)

        if res.modified_count == 0:
            uuid: Binary = generate_uuid()

            d['_id'] = uuid
            d['question_id'] = req_uuid
            d['user_id'] = user.id

            res = await database['votes'].insert_one(d)

            if res.acknowledged:
                inserted.append(UUID(bytes=res.inserted_id))
        else:
            updated.append(req_uuid)

        if len(updated) > 0 or len(inserted) > 0:
            query = {'question_id': req_uuid, 'option_id': d['reply']}
            document = {'$set': {'option_id': d['reply']},
                        '$addToSet': {'votes': {'$each': inserted}}}

            res = await database['answers'].update_one(query, document)

            if res.modified_count == 0:
                uuid: Binary = generate_uuid()

                answer_doc = {
                    '_id': uuid,
                    'option_id': d['reply'],
                    'question_id': req_uuid,
                    'votes': inserted
                }

                await database['answers'].insert_one(answer_doc)

            return d['reply']
        else:
            raise HTTPException(status_code=400, detail='Answer not updated')
예제 #3
0
    async def post_event(request: Event,
                         user=Depends(authenticator.get_current_superuser)):
        event_times = generate_interval(request)
        request_doc = dict(request)
        inserted = []

        for event_time in event_times:
            uuid: Binary = generate_uuid()
            created_at: datetime = datetime.utcnow()

            event_doc: Event = {
                '_id': uuid,
                'author': user.name,
                'created_at': created_at,
                'event_time': event_time,
                'titles': request_doc['titles'],
                'location': request_doc['location'],
                'repeat_unit': request_doc['repeat_unit'],
                'descriptions': request_doc['descriptions'],
                'repeat_interval': request_doc['repeat_interval'],
                'min_participants': request_doc['min_participants'],
                'max_participants': request_doc['max_participants'],
                'contact_person': request_doc['contact_person'],
                'start_time': request_doc['start_time'],
                'end_time': request_doc['end_time'],
                'ngrams': make_ngrams([
                    request_doc['contact_person'],
                    request_doc['descriptions'],
                    request_doc['repeat_unit'],
                    request_doc['location'],
                    request_doc['titles']]
                )
            }

            res = await database['events'].insert_one(event_doc)

            if res.acknowledged:
                inserted.append(res.inserted_id)

        uuid: Binary = generate_uuid()

        calendar_doc: Calendar = {
            '_id': uuid,
            'events': inserted,
            'start_time': request_doc['start_time'],
            'end_time': request_doc['end_time']
        }

        res = await database['calendars'].insert_one(calendar_doc)

        if res.acknowledged:
            return {'detail': 'Events successfully created'}
        else:
            raise HTTPException(
                status_code=400, detail='Error creating calendar')
예제 #4
0
async def setup_translations(database):
    files = os.listdir('./setup/translations')

    for file in files:
        po = pofile(f'./setup/translations/{file}')
        lang = file.split('.')[1]

        r = [{
            x.msgid: x.msgstr,
            'type': 'textarea'
        } if len(x.msgstr) > 32 else {
            x.msgid: x.msgstr,
            'type': 'input'
        } for x in po]

        translation_doc: UpdateTranslation = {}
        translation_doc['modified_at']: datetime = datetime.utcnow()
        translation_doc['translation'] = r

        query = {'lang': lang}
        document = {'$set': translation_doc}

        res = await database['translations'].update_one(query, document)

        if res.modified_count == 0:
            uuid: Binary = generate_uuid()
            created_at: datetime = datetime.utcnow()
            translation_doc: Translation = {
                '_id': uuid,
                'created_at': created_at,
                'translation': r,
                'lang': lang
            }

            await database['translations'].insert_one(translation_doc)
예제 #5
0
    async def post_translation(lang,
                               model: RequestTranslation,
                               user=Depends(
                                   authenticator.get_current_superuser)):
        query = {'lang': lang}
        docs = await database['translations'].count_documents(query)
        res = await database['translations'].find(query).to_list(length=docs)

        i = model.input
        t = model.textarea
        l1 = [{
            x[0]: x[1],
            'type': 'textarea'
        } if len(x[1]) > 32 else {
            x[0]: x[1],
            'type': 'input'
        } for x in i.items()]
        l2 = [{
            x[0]: x[1],
            'type': 'textarea'
        } if len(x[1]) > 32 else {
            x[0]: x[1],
            'type': 'input'
        } for x in t.items()]

        if len(res) == 0:
            uuid: Binary = generate_uuid()
            created_at: datetime = datetime.utcnow()

            translation_doc: Translation = {
                '_id': uuid,
                'created_at': created_at,
                'translation': l1 + l2,
                'lang': lang
            }

            res = await database['translations'].insert_one(translation_doc)

            if res.acknowledged:
                return {'detail': 'Translation was created'}
            else:
                raise HTTPException(status_code=400,
                                    detail='Error creating translation')

        translation_doc: UpdateTranslation = {}
        translation_doc['modified_at']: datetime = datetime.utcnow()
        translation_doc['translation'] = l1 + l2

        query = {'lang': lang}
        document = {'$set': translation_doc}

        res = await database['translations'].update_one(query, document)

        if res.acknowledged:
            return {'detail': 'Updated translation translation'}
        else:
            raise HTTPException(status_code=400,
                                detail='Error creating translation')
예제 #6
0
    async def post_address(model: RequestAddress, user=Depends(
            authenticator.get_current_superuser)):
        address_uuid: Binary = generate_uuid()

        address_doc = dict(model)
        address_doc['_id'] = address_uuid

        res = await database['addresses'].insert_one(address_doc)

        if res.acknowledged:
            organization_uuid: Binary = generate_uuid()

            address_doc: Organization = {}
            address_doc['_id'] = organization_uuid
            address_doc['address_id'] = address_uuid

            res = await database['organizations'].insert_one(address_doc)

            if res.acknowledged:
                return UUID(bytes=res.inserted_id)
            raise HTTPException(
                status_code=400, detail='Organization not created')
        raise HTTPException(
            status_code=400, detail='Address not created')
예제 #7
0
    async def post_subscribe_event(hex,
                                   user=Depends(
                                       authenticator.get_current_superuser)):
        try:
            req_uuid = UUID(hex=hex, version=4)
        except TypeError:
            raise HTTPException(status_code=404, detail='Event was not found')

        query = {'user_id': user.id}
        res = await database['subscriptions'].find(query).to_list(length=150)

        if len(res) == 0:
            uuid: Binary = generate_uuid()
            created_at: datetime = datetime.utcnow()

            subscription_doc: Subscription = {
                '_id': uuid,
                'user_id': user.id,
                'created_at': created_at,
                'events': [req_uuid]
            }

            res = await database['subscriptions'].insert_one(subscription_doc)

            if res.acknowledged:
                return {'detail': 'Subscription was created'}
            else:
                raise HTTPException(status_code=400,
                                    detail='Error creating subscription')

        subscription_doc: Subscription = {}
        subscription_doc['modified_at']: datetime = datetime.utcnow()

        document = {
            '$set': subscription_doc,
            '$addToSet': {
                'events': req_uuid
            }
        }
        query = {'user_id': user.id}

        res = await database['subscriptions'].update_one(query, document)

        if res.acknowledged:
            return {'detail': 'Updated event subscription'}
        else:
            raise HTTPException(status_code=400,
                                detail='Error creating subscription')
예제 #8
0
    async def post_template(topic,
                            locale,
                            model: Template,
                            user=Depends(authenticator.get_current_superuser)):
        d = dict(model)
        d['_id'] = generate_uuid()
        d['topic'] = topic
        d['locale'] = locale
        d['ngrams'] = make_ngrams([d['subject'], d['message']])

        res = await database['templates'].insert_one(d)

        if res.acknowledged:
            return UUID(bytes=res.inserted_id)
        else:
            raise HTTPException(status_code=400,
                                detail='Mail template not created')
예제 #9
0
    async def patch_position(hex, model: RequestPosition, user=Depends(
            authenticator.get_current_superuser)):
        try:
            req_uuid = UUID(hex=hex, version=4)
        except (TypeError, ValueError):
            raise HTTPException(
                status_code=404, detail='Invalid identifier')
        doc = parse_obj_as(List[Position], dict(model)['positions'])
        positions = [dict(x) for x in doc]
        query = {'_id': req_uuid}

        res = await database['organizations'].find_one(query)

        if res is not None:
            for position in positions:
                # TODO: title should be refactored with as _id
                query = {'title': position['title']}
                doc = {'$set': {**position}}

                res = await database['positions'].update_one(query, doc)

                if res.modified_count == 0 and res.matched_count == 0:
                    position_uuid: Binary = generate_uuid()

                    doc = {**position}
                    doc['_id'] = position_uuid

                    res = await database['positions'].insert_one(doc)

                    if res.acknowledged:
                        query = {'_id': req_uuid}
                        doc = {'$addToSet': {'positions': position_uuid}}

                        await database['organizations'].update_one(query, doc)
        else:
            raise HTTPException(
                status_code=404, detail='Organization not updated')
예제 #10
0
    async def patch_event(hex: str,
                          request: UpdateEvent,
                          user=Depends(authenticator.get_current_superuser)):
        try:
            req_uuid = UUID(hex=hex, version=4)
        except (TypeError, ValueError):
            raise HTTPException(status_code=404, detail='Invalid identifier')

        query = {'events': {'$in': [req_uuid]}}
        res = await database['calendars'].find(query).to_list(length=1)

        if len(res) == 0:
            raise HTTPException(status_code=404,
                                detail='Calender was not found')

        updated = []
        inserted = []
        deleted = []

        event_times = generate_interval(request)
        existing_events = len(res[0]['events'])
        interval_events = len(event_times)

        for event_time_index, event_time in enumerate(event_times):
            modified_at: datetime = datetime.utcnow()
            request_doc = dict(request)

            try:
                poll_id = UUID(hex=request_doc['poll_id'])
            except (TypeError, ValueError):
                poll_id = None

            event_doc: Event = {
                '_id':
                uuid,
                'creator':
                user.id,
                'created_at':
                created_at,
                'title':
                request_doc['title'],
                'location':
                request_doc['location'],
                'repeat_unit':
                request_doc['repeat_unit'],
                'description':
                request_doc['description'],
                'repeat_interval':
                request_doc['repeat_interval'],
                'max_participants':
                request_doc['max_participants'],
                'readaccess':
                request_doc['readaccess'],
                'start_time':
                request_doc['start_time'],
                'end_time':
                request_doc['end_time'],
                'poll_id':
                poll_id,
                'ngrams':
                make_ngrams([
                    request_doc['contact_person'], request_doc['descriptions'],
                    request_doc['repeat_unit'], request_doc['location'],
                    request_doc['titles']
                ])
            }

            if existing_events > 0:
                event_doc['modified_by'] = user.id
                event_doc['modified_at'] = modified_at

                document = {'$set': event_doc}
                query = {'_id': {'$in': [res[0]['events'][event_time_index]]}}

                update_res = await database['events'].update_many(
                    query, document)

                if update_res.acknowledged:
                    updated.append(res[0]['events'][event_time_index])
            elif existing_events < 0 and existing_events < interval_events:
                created_at: datetime = datetime.utcnow()
                uuid: Binary = generate_uuid()

                event_doc['_id'] = uuid
                event_doc['author'] = user.name
                event_doc['created_at'] = created_at

                insert_res = await database['events'].insert_one(event_doc)

                if insert_res.acknowledged:
                    inserted.append(insert_res.inserted_id)

            existing_events = existing_events - 1
        interval_events = interval_events - 1

        delete_uuids = set(res[0]['events']) - set(updated)

        if len(delete_uuids) > 0:
            for uuid in delete_uuids:
                query = {'_id': uuid}

                delete_res = await database['events'].delete_one(query)

                if delete_res.deleted_count > 0:
                    deleted.append(uuid)

        if len(inserted) > 0:
            calendar_doc: Calendar = {
                'start_time': request_doc['start_time'],
                'end_time': request_doc['end_time']
            }

            query = {'events': {'$in': [req_uuid]}}
            document = {
                '$set': calendar_doc,
                '$addToSet': {
                    'events': {
                        '$each': inserted
                    }
                }
            }

            await database['calendars'].update_one(query, document)

        if len(updated) > 0:
            calendar_doc: Calendar = {
                'start_time': request_doc['start_time'],
                'end_time': request_doc['end_time']
            }

            query = {'events': {'$in': [req_uuid]}}
            document = {'$set': calendar_doc}

            await database['calendars'].update_one(query, document)

        if len(deleted) > 0:
            calendar_doc: Calendar = {
                'start_time': request_doc['start_time'],
                'end_time': request_doc['end_time']
            }

            query = {'events': {'$in': [req_uuid]}}
            document = {'$pullAll': {'events': deleted}}

            await database['calendars'].update_one(query, document)

        if len(updated) > 0 or len(inserted) > 0 or len(deleted) > 0:
            return {
                'updated': len(updated),
                'inserted': len(inserted),
                'deleted': len(deleted)
            }
        else:
            raise HTTPException(status_code=400, detail='Calendar not updated')
예제 #11
0
 def gen_request_queue_uuid():
     return REQUEST_QUEUE_ID_PREFIX + uuid.generate_uuid()
예제 #12
0
 def gen_rpc_uuid():
     return RPC_ID_PREFIX + uuid.generate_uuid()
예제 #13
0
 def gen_service_uuid():
     return SERVICE_ID_PREFIX + uuid.generate_uuid()