Exemple #1
0
def get_users_source_editor(uuid):
    """
    get the lists of user with permission of editor and manager
    :param uuid: source uuid
    :return:
    """
    try:
        source = SourceRecord.get_record(uuid)
        if not source:
            raise Exception('Not source found')

        if source.user_has_manager_permission(current_user):
            ids = get_user_ids_for_source_from_action('source_editor_actions',
                                                      uuid)
            users = User.query.filter(User.id.in_(ids)).all()
            return iroko_json_response(
                IrokoResponseStatus.SUCCESS, 'ok', 'permission', {
                    'action': 'editor',
                    'source': uuid,
                    'users': user_schema_many.dump(users)
                })

    except Exception as e:
        return iroko_json_response(IrokoResponseStatus.ERROR, str(e), None,
                                   None)
Exemple #2
0
def source_unpublish(uuid):
    # pone source_status = SourceStatus.TO_REVIEW
    try:
        source = SourceRecord.get_record(uuid)
        if not source:
            raise Exception('Not source found')

        if source.user_has_manager_permission(current_user):
            source['source_status'] = SourceStatus.TO_REVIEW.value
            source.update()

            # TODO: aqui hay un error con los get managers
            # notification = NotificationSchema()
            # notification.classification = NotificationType.INFO
            # notification.description = _('Se ha despublicado la fuente: {0}.'.format(source[
            # 'name']))
            # notification.emiter = _('Sistema')
            #
            # for user in source.get_managers:
            #     notification.receiver_id = user
            #     Notifications.new_notification(notification)
            # print('************************** to response')
            return iroko_json_response(IrokoResponseStatus.SUCCESS, 'ok',
                                       'source', source)
    except PermissionDenied as err:
        msg = 'Permission denied for changing source'
        return iroko_json_response(IrokoResponseStatus.ERROR, msg, None, None)
    except Exception as e:
        raise e
        return iroko_json_response(IrokoResponseStatus.ERROR, str(e), None,
                                   None)
Exemple #3
0
def get_editor_source_versions(uuid):
    try:
        # listar las versiones de este editor que no se han revisado para que pueda cambiarlas
        source = SourceRecord.get_record(uuid)
        # print('source> ', source)
        if not source:
            raise Exception('Not source found')

        if source.user_has_edit_permission(current_user):
            versions = source.get_editor_versions_not_reviewed()
            return iroko_json_response(
                IrokoResponseStatus.SUCCESS, \
                'ok', 'source', \
                {
                    'data': source,
                    'versions': source_version_schema_many.dump(versions),
                    'count': 1
                    }
                )

    except PermissionDenied as err:
        msg = 'Permission denied for changing source'
        return iroko_json_response(IrokoResponseStatus.ERROR, msg, None, None)
    except Exception as e:
        return iroko_json_response(IrokoResponseStatus.ERROR, str(e), None,
                                   None)
Exemple #4
0
def repo_schedule_harvest(uuid):
    """
    schedule a harvest of a source
    params:
    uuid: Source uuid
    """
    try:
        source = SourceRecord.get_record(uuid)
        if not source:
            raise Exception('Not source found')
        repository = Repository.query.filter_by(source_uuid=source.id).first()
        if not repository:
            raise Exception('Not repository found')
        if not request.is_json:
            raise Exception("No JSON data provided")

        input_data = request.json

        schedule_datetime = datetime.datetime.now()
        if 'datetime' in input_data:
            schedule_datetime = input_data['datetime']

        harvester_class = 'iroko.harvester.oai.harvester.OaiHarvester'
        if 'harvester_class' in input_data:
            harvester_class = input_data['harvester_class']
        # TODO: how instantiate an object from a class name.
        oai_harvester = OaiHarvester(repository)
        HarvestersTaskManager.schedule_harvest(oai_harvester,
                                               schedule_datetime)

        return iroko_json_response(IrokoResponseStatus.SUCCESS, 'ok',
                                   'repositories', None)
    except Exception as e:
        msg = str(e)
        return iroko_json_response(IrokoResponseStatus.ERROR, msg, None, None)
Exemple #5
0
def source_publish(uuid):
    # inserta un nuevo sourceVersion de un source que ya existe
    # input_data = request.json
    # updata el input_data en el SourceRecord

    try:
        if not request.is_json:
            raise Exception("No JSON data provided")

        input_data = request.json
        user_id = current_user.id

        comment = 'no comment'
        if 'comment' in input_data:
            comment = input_data['comment']

        source = SourceRecord.get_record(uuid)
        if not source:
            raise Exception('Not source found')

        if source.user_has_manager_permission(current_user):

            data = dict(input_data['data'])
            data['source_status'] = SourceStatus.APPROVED.value

            source_version = IrokoSourceVersions.new_version(source.id,
                                                             data,
                                                             user_id=user_id,
                                                             comment=comment,
                                                             is_current=True)
            if not source_version:
                raise Exception('Not source for changing found')

            source.update(data)

            # TODO: aqui hay un error con los get managers
            # notification = NotificationSchema()
            # notification.classification = NotificationType.INFO
            # notification.description = _('Se ha publicado una nueva version de la fuente: {0}:{
            # 1}.'.format(source['name'], source.id))
            # notification.emiter = _('Sistema')
            #
            # for user in source.get_managers:
            #     notification.receiver_id = user
            #     Notifications.new_notification(notification)

            # print('************************** to response')
            return iroko_json_response(IrokoResponseStatus.SUCCESS, 'ok',
                                       'source', source)
    except PermissionDenied as err:
        msg = 'Permission denied for changing source'
    except PIDObjectAlreadyAssigned as err:
        msg = 'El Identificador persistente ya existe: ' + str(err)
        # print('*******', msg)
    except Exception as e:
        msg = str(e)
    # print('*******', msg)
    return iroko_json_response(IrokoResponseStatus.ERROR, msg, None, None)
Exemple #6
0
def source_new_version(uuid):
    # inserta un nuevo sourceVersion de un source que ya existe
    # input_data = request.json
    # source = Sources.get_source_by_id(uuid=uuid)
    # Sources.insert_new_source_version(input_data, source, False)

    try:
        if not request.is_json:
            raise Exception("No JSON data provided")

        input_data = request.json
        user_id = current_user.id

        comment = 'no comment'
        if 'comment' in input_data:
            comment = input_data['comment']

        source = SourceRecord.get_record(uuid)
        if not source:
            raise Exception('Not source found')

        if source.user_has_edit_permission(current_user):
            # si no esta aprobada significa que siempre es la current.
            # si esta aprobada el proceso es otro
            # print(input_data)

            data = dict(input_data['data'])
            # data['source_status'] = SourceStatus.TO_REVIEW.value
            #
            # source.update(data)

            source_version = IrokoSourceVersions.new_version(source.id,
                                                             data,
                                                             user_id=user_id,
                                                             comment=comment,
                                                             is_current=False)
            if not source_version:
                raise Exception('Not source for changing found')

            # notification = NotificationSchema()
            # notification.classification = NotificationType.INFO
            # notification.description = _('Editor has change this source: {0}.'.format(source[
            # 'name']))
            # notification.emiter = _('Sistema')
            #
            # for user in source.get_managers:
            #     notification.receiver_id = user
            #     Notifications.new_notification(notification)

            return iroko_json_response(
                IrokoResponseStatus.SUCCESS, 'ok', 'source_version',
                source_version_schema.dump(source_version))
    except PermissionDenied as err:
        msg = 'Permission denied for changing source'
        return iroko_json_response(IrokoResponseStatus.ERROR, msg, None, None)
    except Exception as e:
        raise e
Exemple #7
0
    def fix_data_field(self, result, version: SourceVersion, **kwargs):

        source = SourceRecord.get_record(version.source_uuid)
        # print('************* POST DUMP ***************')
        # print(source.model.json['source_type'], )
        if source.model.json['source_type'] == SourceType.JOURNAL.value:
            data = journal_data_schema.dump(version.data)
        else:
            data = source_base_data_schema.dump(version.data)
        result['data'] = data
        # print('************* POST DUMP ***************')
        return result
Exemple #8
0
def set_source_editor(user, uuid, allow=False):
    """
    Set user as editor of a source
    :param uuid: source uuid
    :param user: user id
    :param allow: if allow or deny
    :return:
    """
    try:
        offset = request.args.get('offset') if request.args.get(
            'offset') else 3
        source = SourceRecord.get_record(uuid)
        if not source:
            raise Exception('Not source found')
        userObj = User.query.filter_by(id=user).first()
        if not userObj:
            raise Exception('User not found')

        if source.user_has_manager_permission(current_user):
            with db.session.begin_nested():
                ActionUsers.query.filter_by(user_id=user,
                                            action='source_editor_actions',
                                            argument=uuid).delete()
                if allow:
                    db.session.add(
                        ActionUsers.allow(ObjectSourceEditor(uuid),
                                          user=userObj))
                else:
                    db.session.add(
                        ActionUsers.deny(ObjectSourceEditor(uuid),
                                         user=userObj))
            db.session.commit()
            return iroko_json_response(
                IrokoResponseStatus.SUCCESS, 'ok', 'permission', {
                    'source': uuid,
                    'user': user,
                    'permission': 'editor',
                    'allow': allow
                })
        raise PermissionDenied()

    except PermissionDenied as err:
        msg = 'Permission denied'
        return iroko_json_response(IrokoResponseStatus.ERROR, msg, None, None)
    except Exception as e:
        return iroko_json_response(IrokoResponseStatus.ERROR, str(e), None,
                                   None)
Exemple #9
0
def get_source_by_uuid(uuid):
    """Get all source versions by source UUID, with permission checking"""
    # source = SourcesDeprecated.get_source_by_id(uuid=uuid)
    # return iroko_json_response(IrokoResponseStatus.SUCCESS, \
    #                             'ok','versions', \
    #                             source_schema.dump(source))
    try:
        source = SourceRecord.get_record(uuid)
        # SourcesDeprecated.get_source_by_id(uuid=uuid)
        if not source:
            raise Exception('Source not found')

        terms = helper_get_classifications_string(source)
        #
        # # print(source.model.json)
        # if 'classifications' in source.model.json:
        #     for term in source.model.json['classifications']:
        #         if 'id' in term:
        #             terms = terms + str(term['id']) + ','
        # if terms:
        #     terms = terms[0:-1]

        if user_has_editor_or_manager_permissions({
                'terms': terms,
                'uuid': uuid
        }):
            # # # print(source.data)
            # for v in source.term_sources:
            #     # print(v.term_id, v.sources_id, v.data)
            #     # # print(v.data)
            versions = IrokoSourceVersions.get_versions(uuid)
            return iroko_json_response(
                IrokoResponseStatus.SUCCESS, \
                'ok', 'versions', \
                source_version_schema_many.dump(versions)
                )

        raise PermissionDenied('No tiene permiso')

    except Exception as e:
        # print(traceback.format_exc())
        return iroko_json_response(IrokoResponseStatus.ERROR, str(e), None,
                                   None)
Exemple #10
0
def repo_status(uuid):
    """
    get the status of a repository
    params:
    uuid: Source uuid
    """
    try:
        source = SourceRecord.get_record(uuid)
        if not source:
            raise Exception('Not source found')
        repository = Repository.query.filter_by(source_uuid=source.id).first()
        if not repository:
            raise Exception('Not repository found')
        # TODO: get all the process info of the record
        return iroko_json_response(IrokoResponseStatus.SUCCESS, 'ok',
                                   'repositories', None)
    except Exception as e:
        msg = str(e)
        return iroko_json_response(IrokoResponseStatus.ERROR, msg, None, None)
Exemple #11
0
def get_source_versions(uuid):
    """Get all source versions by source UUID, with permission checking"""

    try:
        source = SourceRecord.get_record(uuid)
        if not source:
            raise Exception('Source not found')

        if source.user_has_edit_permission(current_user):
            versions = IrokoSourceVersions.get_versions(uuid)
            dd = source_version_schema_many.dump(versions)
            # print(dd)
            return iroko_json_response(
                IrokoResponseStatus.SUCCESS, \
                'ok', 'versions', \
                dd
                )
    except Exception as e:
        # print()
        return iroko_json_response(IrokoResponseStatus.ERROR,
                                   traceback.format_exc(), None, None)
Exemple #12
0
 def full_source(self, record, **kwargs):
     source_uuid = record['source_repo']['uuid']
     source = SourceRecord.get_record(source_uuid)
     record['source_repo'] = source
     return record
Exemple #13
0
def view_source_id(uuid):
    src = SourceRecord.get_record(uuid)
    # source = source_schema_many.dump(src)
    return render_template('iroko_theme/sources/source.html', source=src)