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)
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)
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)
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)
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)
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
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
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)
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)
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)
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)
def full_source(self, record, **kwargs): source_uuid = record['source_repo']['uuid'] source = SourceRecord.get_record(source_uuid) record['source_repo'] = source return record
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)