Beispiel #1
0
    def post(self, questionnaire_id=None):
        schema = ShadowDimensionSchema()
        data, errors = schema.load(request.json)
        for err in errors:
            if err in data:
                del data[err]

        if not data:
            return {
                'message': 'Dimension not created. Some errors occurred.',
                'errors': errors
            }, 400

        questionnaire = Questionnaire.query.get_or_404(questionnaire_id)
        dimension = Dimension.query.get_or_404(data['id'])
        if not questionnaire.accessible_by(current_user()):
            abort(403)
        if not questionnaire.modifiable_by(current_user()):
            abort(403)
        if questionnaire.shadow:
            abort(403)
        if dimension.shadow:
            abort(403)

        shadow_dimension = questionnaire.add_shadow_dimension(dimension)
        db.session.commit()

        data = DimensionSchema().dump(shadow_dimension).data
        return {
            'message': 'Dimension created.',
            'dimension': data
        }
Beispiel #2
0
 def delete(self):
     dataclient_data = DataClientSchema().dump(current_user()).data
     db.session.delete(current_user())
     db.session.commit()
     auth.session.logout()
     return {
         'message': 'DataClient removed',
         'data_client': dataclient_data
     }
Beispiel #3
0
 def delete(self, **kwargs):
     question = self.get_question_or_404(**kwargs)
     if not question.accessible_by(current_user()):
         abort(403)
     if not question.modifiable_by(current_user()):
         abort(403)
     data = QuestionSchema().dump(question).data
     question.dimension.remove_question(question)
     db.session.commit()
     return {'message': 'Question removed.', 'question': data}
Beispiel #4
0
 def delete(self, questionnaire_id=None):
     questionnaire = Questionnaire.query.get_or_404(questionnaire_id)
     if not questionnaire.accessible_by(current_user()):
         abort(403)
     if not questionnaire.modifiable_by(current_user()):
         abort(403)
     data = QuestionnaireSchema().dump(questionnaire).data
     questionnaire.delete()
     db.session.commit()
     return {'message': 'Questionnaire removed.', 'questionnaire': data}
Beispiel #5
0
    def get(self, questionnaire_id: int=None):
        questionnaire = Questionnaire.query.get_or_404(questionnaire_id)
        if not questionnaire.accessible_by(current_user()):
            abort(403)
        if not questionnaire.modifiable_by(current_user()):
            abort(403)

        statistics = []
        for dimension in questionnaire.dimensions:
            for question in dimension.questions:
                statistics.append(question.statistic)

        return QuestionStatisticSchema(many=True).dump(statistics)
Beispiel #6
0
    def patch(self,
              questionnaire_id=None,
              dimension_id=None,
              question_id=None):
        question = self.get_question_or_404(questionnaire_id, dimension_id,
                                            question_id)
        if not question.accessible_by(current_user()):
            abort(403)
        if not question.modifiable_by(current_user()):
            abort(403)

        schema = QuestionSchema()
        data, errors = schema.load(request.json, partial=True)
        for err in errors:
            if err in data:
                del data[err]
        if not data:
            return {
                'message': 'Question not updated. Some errors occurred.',
                'errors': errors
            }, 400

        shadow_attributes = ['position']
        for k, v in data.items():
            if isinstance(question, ShadowQuestion):
                if k not in shadow_attributes:
                    errors[k] = [
                        'Can\'t update {} of a ShadowQuestion. The contributor owning '
                        'the template is responsible for the Dimension\'s content.'
                        .format(k)
                    ]
                    continue
            else:
                if 'k' == 'template':
                    if not current_has_minimum_role(Role.Contributor):
                        errors[k] = [
                            'You need to be a contributor to publish '
                            'templates.'
                        ]
                        continue
            setattr(question, k, v)
        db.session.commit()

        response = {
            'message': 'Question updated.',
            'question': schema.dump(question).data
        }
        if errors:
            response['message'] += ' Some errors occurred.'
            response['errors'] = errors
        return response
Beispiel #7
0
    def __init__(self):
        self.__platform = "st3k101"
        if current_user() and isinstance(current_user(), DataSubject):
            self.__platform += " via {}".format(current_user().source)

        self.__language = g._language.name

        try:
            ip = get_client_ip(
            ) if not g._config['DEBUG_SPOOF_LOCATION'] else "141.2.1.21"
            location = geolite2.reader().get(ip)["location"]
            self.__geolocation = (location["latitude"], location["longitude"])
        except (ValueError, TypeError):
            self.__geolocation = None
Beispiel #8
0
    def get(self,
            questionnaire_id: int=None,
            dimension_id: int=None,
            question_id: int=None
            ):
        _, _, question = validate_resource_path(
            questionnaire_id,
            dimension_id,
            question_id
        )
        if not question.accessible_by(current_user()):
            abort(403)
        if not question.modifiable_by(current_user()):
            abort(403)

        return QuestionStatisticSchema().dump(question.statistic)
Beispiel #9
0
    def post(self):
        schema = ShadowQuestionnaireSchema()
        data, errors = schema.load(request.json)
        for err in errors:
            if err in data:
                del data[err]

        if not data:
            return {
                'message': 'Questionnaire not created. Some errors occurred.',
                'errors': errors
            }, 400

        questionnaire = Questionnaire.query.get_or_404(data['id'])
        if not questionnaire.accessible_by(current_user()):
            abort(403)
        if questionnaire.shadow:
            abort(403)
        shadow_questionnaire = ShadowQuestionnaire(questionnaire)
        db.session.add(shadow_questionnaire)
        db.session.commit()

        data = QuestionnaireSchema().dump(shadow_questionnaire).data
        return {
            'message': 'Questionnaire created.',
            'questionnaire': data
        }, 201
Beispiel #10
0
def track_translation_hybrid_updated(sender: 'SurveyBase',
                                     property_name=None,
                                     previous_value=None,
                                     new_value=None):
    if previous_value is None:
        return

    if previous_value == new_value:
        return

    previous_entries = TranslatedPropertyUpdatedTrackerEntry.query\
        .filter_by(item=sender, property_name=property_name, language=g._language)
    for p in previous_entries:
        db.session.delete(p)

    te = TranslatedPropertyUpdatedTrackerEntry(dataclient=current_user(),
                                               item_name=sender.name,
                                               item=sender,
                                               property_name=property_name,
                                               previous_value=previous_value,
                                               new_value=new_value)
    db.session.add(te)

    te.owners.extend(sender.owners)
    # make all people with a reference (shadow copy) of sender own the tracker
    # entry, so that the change will be shown in their feed
    if hasattr(sender, 'copies'):
        for copy in sender.copies:
            te.owners.extend(copy.owners)
Beispiel #11
0
    def get(self, questionnaire_id=None, dimension_id=None, question_id=None):
        question = self.get_question_or_404(questionnaire_id, dimension_id,
                                            question_id)
        if not question.accessible_by(current_user()):
            abort(403)

        return QuestionSchema().dump(question).data
Beispiel #12
0
    def patch(self):
        dataclient = current_user()
        schema = DataClientSchema(partial=True)
        data, errors = schema.load(request.json)
        for err in errors:
            if err in data:
                del data[err]

        if not data:
            return {
                'message': 'DataClient not updated. Some errors occurred',
                'errors': errors
            }, 400

        for k, v in data.items():
            if k == 'roles':
                if not current_has_minimum_role(Role.Admin):
                    errors[k] = [
                        'You are note allowed to change user\'s '
                        'roles'
                    ]
                    continue
                dataclient.update_roles(data['roles'])
            setattr(dataclient, k, v)
        db.session.commit()

        response = {
            'message': 'DataClient updated.',
            'data_client': schema.dump(dataclient).data
        }
        if errors:
            response['message'] += ' Some errors occurred.'
            response['errors'] = errors
        return response
Beispiel #13
0
 def get(self, questionnaire_id=None):
     schema = QuestionnaireSchema()
     questionnaire = Questionnaire.query.get_or_404(questionnaire_id)
     if not questionnaire.accessible_by(current_user()):
         if not questionnaire.published:
             abort(403)
     db.session.commit()
     return schema.dump(questionnaire).data
Beispiel #14
0
 def get(self, questionnaire_id=None, dimension_id=None):
     dimension = Dimension.query.get_or_404(dimension_id)
     if questionnaire_id is not None:
         if dimension.questionnaire_id != questionnaire_id:
             abort(404)
     if not dimension.accessible_by(current_user()):
         abort(403)
     return DimensionSchema().dump(dimension).data
Beispiel #15
0
 def delete(self, questionnaire_id=None, dimension_id=None):
     dimension = Dimension.query.get_or_404(dimension_id)
     if questionnaire_id is not None:
         questionnaire = Questionnaire.query.get_or_404(questionnaire_id)
     else:
         questionnaire = dimension.questionnaire
     if not dimension.accessible_by(current_user()):
         abort(403)
     if not dimension.modifiable_by(current_user()):
         abort(403)
     data = DimensionSchema().dump(dimension).data
     questionnaire.remove_dimension(dimension)
     db.session.commit()
     return {
         'message': 'Dimension removed.',
         'dimension': data
     }
Beispiel #16
0
 def build_owned_incoming_references(self, obj: SurveyBase):
     return list(
         map(
             lambda q: {
                 "href": super(SurveyBaseSchema, self).build_href(q),
                 "id": q.id
             }, filter(lambda q: q.accessible_by(current_user()),
                       obj.copies)))
Beispiel #17
0
 def get(self, questionnaire_id: int = None, dimension_id: int = None):
     dimension = Dimension.query.get_or_404(dimension_id)
     if questionnaire_id is not None:
         if questionnaire_id != dimension.questionnaire_id:
             abort(404)
     if not dimension.accessible_by(current_user()):
         abort(403)
     tracker_entries = tracker_entries_for_survey_base(dimension)
     return serialize_mixed_list(tracker_entries, TRACKER_ENTRY_MAPPING)
Beispiel #18
0
    def post(self, questionnaire_id: int = None, dimension_id: int = None):
        schema = QuestionSchema()
        data, errors = schema.load(request.json)
        for err in errors:
            if err in data:
                del data[err]
        if not data:
            return {
                'message': 'Question not created. Some errors occurred.',
                'errors': errors
            }, 400

        dimension = Dimension.query.get_or_404(dimension_id)
        if questionnaire_id is not None:
            if dimension.questionnaire_id != questionnaire_id:
                abort(404)
        if not dimension.accessible_by(current_user()):
            abort(403)
        if not dimension.modifiable_by(current_user()):
            abort(403)
        if dimension.shadow:
            abort(403)

        question = dimension.new_question(data['text'],
                                          data['range_start_label'],
                                          data['range_end_label'])

        for k, v in data.items():
            if 'k' == 'template':
                if not current_has_minimum_role(Role.Contributor):
                    errors[k] = [
                        'You need to be a contributor to publish '
                        'templates.'
                    ]
                    continue
            setattr(question, k, v)
        db.session.commit()

        data = QuestionSchema().dump(question).data
        response = {'message': 'Question created.', 'question': data}
        if errors:
            response['message'] += ' Some errors occurred.'
            response['errors'] = errors
        return response, 201
Beispiel #19
0
    def get(self, dataclient_id=None):
        schema = DataClientSchema()

        if dataclient_id != current_user().id:
            if not current_has_minimum_role(Role.Admin):
                abort(403,
                      message='You are not allowed to access other user\'s'
                      ' data.')
        dataclient = DataClient.query.get_or_404(dataclient_id)
        return schema.dump(dataclient).data
Beispiel #20
0
    def get(self, questionnaire_id: int = None, dimension_id: int = None):
        dimension = Dimension.query.get_or_404(dimension_id)
        if not dimension.accessible_by(current_user()):
            abort(403)
        if questionnaire_id is not None:
            if dimension.questionnaire_id != questionnaire_id:
                abort(404)

        schema = QuestionSchema(many=True)
        return schema.dump(dimension.questions).data
Beispiel #21
0
def track_questionnaire_removed(sender: 'SurveyBase'):
    te = QuestionnaireRemovedTrackerEntry(dataclient=current_user(),
                                          questionnaire_name=sender.name)
    db.session.add(te)
    te.owners.extend(sender.owners)
    # make all people with a reference (shadow copy) of sender own the tracker
    # entry, so that the change will be shown in their feed
    if hasattr(sender, 'copies'):
        for copy in sender.copies:
            te.owners.extend(copy.owners)
Beispiel #22
0
 def get(self, questionnaire_id: int = None):
     questionnaire = Questionnaire.query.get_or_404(questionnaire_id)
     if not questionnaire.accessible_by(current_user()):
         abort(403)
     schema = QuestionResponseSchema(many=True)
     responses = []
     for dimension in questionnaire.dimensions:
         for question in dimension.questions:
             responses += question.responses
     return schema.dump(responses).data
Beispiel #23
0
 def get(self,
         questionnaire_id: int = None,
         dimension_id: int = None,
         question_id: int = None):
     _, _, question = validate_resource_path(questionnaire_id, dimension_id,
                                             question_id)
     if question is None:
         abort(404)
     if not question.accessible_by(current_user()):
         abort(403)
     schema = QuestionResponseSchema(many=True)
     return schema.dump(question.responses).data
Beispiel #24
0
def track_item_removed(sender: 'SurveyBase', removed_item_name: str = None):
    te = ItemRemovedTrackerEntry(dataclient=current_user(),
                                 parent_item_name=sender.name,
                                 parent_item=sender,
                                 removed_item_name=removed_item_name)
    db.session.add(te)
    te.owners.extend(sender.owners)
    # make all people with a reference (shadow copy) of sender own the tracker
    # entry, so that the change will be shown in their feed
    if hasattr(sender, 'copies'):
        for copy in sender.copies:
            te.owners.extend(copy.owners)
Beispiel #25
0
    def get(self, dataclient_id=None):
        if dataclient_id is None:
            dataclient = current_user()
        else:
            if not current_has_minimum_role(Role.Admin):
                abort(403)
            dataclient = DataClient.query.get(dataclient_id)

        query = query_owned(DataClient, dataclient.id, Questionnaire)
        questionnaires = query.all()

        schema = QuestionnaireSchema(many=True)
        return schema.dump(questionnaires).data
Beispiel #26
0
    def post(self, questionnaire_id=None):
        schema = DimensionSchema()
        data, errors = schema.load(request.json)
        for err in errors:
            if err in data:
                del data[err]
        if not data:
            return {
                'message': 'Dimension not created. Some errors occurred.',
                'errors': errors
            }, 400

        questionnaire = Questionnaire.query.get_or_404(questionnaire_id)
        if not questionnaire.accessible_by(current_user()):
            abort(403)
        if not questionnaire.modifiable_by(current_user()):
            abort(403)
        if questionnaire.shadow:
            abort(403)

        dimension = questionnaire.new_dimension(data['name'])
        for k, v in data.items():
            if k == 'template':
                if not current_has_minimum_role(Role.Contributor):
                    errors[k] = ['You need to be a contributor to publish '
                                 'templates.']
                    continue
            setattr(dimension, k, v)
        db.session.commit()

        data = DimensionSchema().dump(dimension).data
        response = {
            'message': 'Dimension created.',
            'dimension': data
        }
        if errors:
            response['message'] += ' Some errors occurred.'
            response['errors'] = errors
        return response, 201
Beispiel #27
0
 def get(self,
         questionnaire_id: int = None,
         dimension_id: int = None,
         question_id: int = None,
         response_id: int = None):
     _, _, question = validate_resource_path(questionnaire_id, dimension_id,
                                             question_id)
     response = QuestionResponse.query.get_or_404(response_id)
     if question is not None:
         if response.question_id != question.id:
             abort(404)
     if not response.accessible_by(current_user()):
         abort(403)
     return QuestionResponseSchema().dump(response).data
Beispiel #28
0
    def post(self, questionnaire_id: int = None, dimension_id: int = None):
        schema = ShadowQuestionSchema()
        data, errors = schema.load(request.json)
        dimension = Dimension.query.get_or_404(dimension_id)
        question = Question.query.get_or_404(data['id'])

        if not dimension.accessible_by(current_user()):
            abort(403)
        if questionnaire_id is not None:
            if dimension.questionnaire_id != questionnaire_id:
                abort(404)
        if not dimension.modifiable_by(current_user()):
            abort(403)
        if dimension.shadow:
            abort(403)
        if question.shadow:
            abort(403)

        shadow_question = dimension.add_shadow_question(question)
        db.session.commit()

        data = QuestionSchema().dump(shadow_question).data
        return {'message': 'Question created.', 'question': data}, 201
Beispiel #29
0
 def delete(self, dataclient_id=None):
     if dataclient_id != current_user().id:
         if not current_has_minimum_role(Role.Admin):
             abort(403,
                   message='You are not allowed to remove other user\'s'
                   ' accounts.')
     dataclient = DataClient.query.get_or_404(dataclient_id)
     dataclient_data = DataClientSchema().dump(dataclient).data
     db.session.delete(dataclient)
     db.session.commit()
     return {
         'message': 'DataClient removed',
         'data_client': dataclient_data
     }
Beispiel #30
0
    def strip_private_fields(self, data, original_data: SurveyBase = None):
        def _strip(d):
            for k in self.get_private():
                if k in d:
                    del d[k]
            return d

        if isinstance(original_data, list):
            for od in original_data:
                if od.id == data['id']:
                    original_data = od
                    break

        if not original_data.modifiable_by(current_user()):
            return _strip(data)