def insert( class_: str, origin_id: Optional[int] = None) -> Union[str, Response]: check_insert_access(class_) origin = Entity.get_by_id(origin_id) if origin_id else None form = build_form(class_, origin=origin) if form.validate_on_submit(): if class_ == 'file': return redirect(insert_files(form, origin)) return redirect(save(form, class_=class_, origin=origin)) populate_insert_form(form, class_, origin) place_info = get_place_info_for_insert(g.classes[class_].view, origin) return render_template( 'entity/insert.html', form=form, view_name=g.classes[class_].view, gis_data=place_info['gis_data'], geonames_module=check_geonames_module(class_), writable=os.access(app.config['UPLOAD_DIR'], os.W_OK), overlays=place_info['overlays'], title=_(g.classes[class_].view), crumbs=add_crumbs( class_, origin, place_info['structure'], insert_=True))
def relation_insert(origin_id: int) -> Union[str, Response]: origin = Entity.get_by_id(origin_id) form = build_form('actor_actor_relation') form.relation_origin_id.data = origin.id if form.validate_on_submit(): Transaction.begin() try: for actor in Entity.get_by_ids(ast.literal_eval(form.actor.data)): if form.inverse.data: link_ = Link.get_by_id( actor.link('OA7', origin, form.description.data)[0]) else: link_ = Link.get_by_id( origin.link('OA7', actor, form.description.data)[0]) link_.set_dates(form) link_.type = get_link_type(form) link_.update() Transaction.commit() flash(_('entity created'), 'info') except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') if hasattr(form, 'continue_') and form.continue_.data == 'yes': return redirect(url_for('relation_insert', origin_id=origin_id)) return redirect( url_for('entity_view', id_=origin.id) + '#tab-relation') return render_template( 'display_form.html', form=form, title=_('relation'), crumbs=[[_('actor'), url_for('index', view='actor')], origin, '+ ' + uc_first(_('relation'))])
def hierarchy_insert(category: str) -> Union[str, Response]: form = build_form('hierarchy', code=category) form.classes.choices = Type.get_class_choices() if form.validate_on_submit(): if Type.check_hierarchy_exists(form.name.data): flash(_('error name exists'), 'error') return render_template('display_form.html', form=form) try: Transaction.begin() type_ = Entity.insert('type', sanitize(form.name.data)) Type.insert_hierarchy( type_, # type: ignore category, form.classes.data, is_multiple(form, category)) type_.update(process_form_data(form, type_)) Transaction.commit() except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') abort(418) flash(_('entity created'), 'info') return redirect(f"{url_for('type_index')}#menu-tab-{category}") return render_template( 'display_form.html', form=form, manual_page='entity/type', title=_('types'), crumbs=[ [_('types'), url_for('type_index')], f'+ {uc_first(_(category))}'])
def relation_update(link_: Link, domain: Entity, range_: Entity, origin: Entity) -> Union[str, Response]: origin = range_ if origin.id == range_.id else domain related = range_ if origin.id == domain.id else domain form = build_form('actor_actor_relation', link_) if form.validate_on_submit(): Transaction.begin() try: link_.delete() if form.inverse.data: link_ = Link.get_by_id( related.link('OA7', origin, form.description.data)[0]) else: link_ = Link.get_by_id( origin.link('OA7', related, form.description.data)[0]) link_.set_dates(process_form_dates(form)) link_.type = get_link_type(form) link_.update() Transaction.commit() flash(_('info update'), 'info') except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return redirect(f"{url_for('view', id_=origin.id)}#tab-relation") if origin.id == range_.id: form.inverse.data = True return render_template( 'display_form.html', form=form, title=_('relation'), crumbs=[[_('actor'), url_for('index', view='actor')], origin, related, _('edit')])
def update(id_: int) -> Union[str, Response]: entity = Entity.get_by_id(id_, types=True, aliases=True) check_update_access(entity) if entity.check_for_too_many_links_for_single_type(): abort(422) place_info = get_place_info_for_update(entity) form = build_form(entity.class_.name, entity, location=place_info['location']) if form.validate_on_submit(): if isinstance(entity, Type) and not check_type(entity, form): return redirect(url_for('view', id_=entity.id)) if was_modified(form, entity): # pragma: no cover del form.save flash(_('error modified'), 'error') return render_template( 'entity/update.html', form=form, entity=entity, modifier=link(logger.get_log_info(entity.id)['modifier'])) return redirect(save(form, entity)) populate_update_form(form, entity) if entity.class_.view in ['artifact', 'place']: entity.set_image_for_places() return render_template( 'entity/update.html', form=form, entity=entity, gis_data=place_info['gis_data'], overlays=place_info['overlays'], geonames_module=check_geonames_module(entity.class_.name), title=entity.name, crumbs=add_crumbs(entity.class_.name, entity, place_info['structure']))
def hierarchy_update(id_: int) -> Union[str, Response]: hierarchy = g.nodes[id_] if hierarchy.standard: abort(403) form = build_form('hierarchy', hierarchy) form.forms.choices = Node.get_form_choices(hierarchy) if hasattr(form, 'multiple') and form.multiple.data: form.multiple.render_kw = {'disabled': 'disabled'} if form.validate_on_submit(): if form.name.data != hierarchy.name and Node.get_nodes(form.name.data): flash(_('error name exists'), 'error') else: save(form, hierarchy) flash(_('info update'), 'info') tab = 'value' if g.nodes[id_].value_type else 'custom' return redirect( f"{url_for('node_index')}#menu-tab-{tab}_collapse-{hierarchy.id}") form.multiple = hierarchy.multiple table = Table(paging=False) for form_id, form_ in hierarchy.forms.items(): count = Node.get_form_count(hierarchy, form_id) table.rows.append([ g.classes[form_['name']].label, format_number(count) if count else link( _('remove'), url_for('remove_form', id_=hierarchy.id, form_id=form_id)) ]) return render_template('display_form.html', form=form, table=table, manual_page='entity/type', title=_('types'), crumbs=[[_('types'), url_for('node_index')], hierarchy, _('edit')])
def member_update(id_: int, origin_id: int) -> Union[str, Response]: link_ = Link.get_by_id(id_) domain = Entity.get_by_id(link_.domain.id) range_ = Entity.get_by_id(link_.range.id) origin = range_ if origin_id == range_.id else domain form = build_form('actor_function', link_) if form.validate_on_submit(): Transaction.begin() try: link_.delete() link_ = Link.get_by_id( domain.link('P107', range_, form.description.data)[0]) link_.set_dates(process_form_dates(form)) link_.type = get_link_type(form) link_.update() Transaction.commit() except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return redirect( f"{url_for('view', id_=origin.id)}" f"#tab-member{'-of' if origin.id == range_.id else ''}") form.save.label.text = _('save') related = range_ if origin_id == domain.id else domain return render_template( 'display_form.html', form=form, crumbs=[[_('actor'), url_for('index', view='actor')], origin, related, _('edit')])
def hierarchy_update(id_: int) -> Union[str, Response]: hierarchy = g.types[id_] if hierarchy.category in ('standard', 'system'): abort(403) form = build_form('hierarchy', hierarchy) form.classes.choices = Type.get_class_choices(hierarchy) linked_entities = set() has_multiple_links = False for entity in get_entities_linked_to_type_recursive(id_, []): if entity.id in linked_entities: has_multiple_links = True break linked_entities.add(entity.id) if hasattr(form, 'multiple') and has_multiple_links: form.multiple.render_kw = {'disabled': 'disabled'} if form.validate_on_submit(): if form.name.data != hierarchy.name and Type.get_types(form.name.data): flash(_('error name exists'), 'error') else: Transaction.begin() try: Type.update_hierarchy(hierarchy, sanitize(form.name.data), form.classes.data, multiple=(hierarchy.category == 'value' or (hasattr(form, 'multiple') and form.multiple.data) or has_multiple_links)) hierarchy.update(process_form_data(form, hierarchy)) Transaction.commit() except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') abort(418) flash(_('info update'), 'info') tab = 'value' if g.types[id_].category == 'value' else 'custom' return redirect( f"{url_for('type_index')}#menu-tab-{tab}_collapse-{hierarchy.id}") form.multiple = hierarchy.multiple table = Table(paging=False) for class_name in hierarchy.classes: count = Type.get_form_count(hierarchy, class_name) table.rows.append([ g.classes[class_name].label, format_number(count) if count else link( _('remove'), url_for( 'remove_class', id_=hierarchy.id, class_name=class_name)) ]) return render_template('display_form.html', form=form, table=table, manual_page='entity/type', title=_('types'), crumbs=[[_('types'), url_for('type_index')], hierarchy, _('edit')])
def translation_update(id_: int) -> Union[str, Response]: translation = Entity.get_by_id(id_, nodes=True) form = build_form('source_translation', translation) if form.validate_on_submit(): save(form, translation) flash(_('info update'), 'info') return redirect(url_for('entity_view', id_=translation.id)) return render_template( 'display_form.html', form=form, title=translation.name, crumbs=[[_('source'), url_for('index', view='source')], translation.get_linked_entity('P73', True), translation, _('edit')])
def translation_insert(source_id: int) -> Union[str, Response]: source = Entity.get_by_id(source_id) form = build_form('source_translation') if form.validate_on_submit(): translation = save(form, source=source) flash(_('entity created'), 'info') if hasattr(form, 'continue_') and form.continue_.data == 'yes': return redirect(url_for('translation_insert', source_id=source.id)) return redirect(url_for('entity_view', id_=translation.id)) return render_template( 'display_form.html', form=form, crumbs=[[_('source'), url_for('index', view='source')], source, f"+ {uc_first(_('text'))}"])
def note_insert(entity_id: int) -> Union[str, Response]: entity = Entity.get_by_id(entity_id) form = build_form('note') if form.validate_on_submit(): User.insert_note(entity_id, form.description.data, form.public.data) flash(_('note added'), 'info') return redirect(f"{url_for('view', id_=entity.id)}#tab-note") return render_template('display_form.html', form=form, entity=entity, crumbs=[[ _(entity.class_.view), url_for('index', view=entity.class_.view) ], entity, f"+ {uc_first(_('note'))}"])
def involvement_insert(origin_id: int) -> Union[str, Response]: origin = Entity.get_by_id(origin_id) form = build_form('involvement', origin=origin) form.activity.choices = [('P11', g.properties['P11'].name_inverse)] if origin.class_.name in ['acquisition', 'activity', 'production']: form.activity.choices.append(('P14', g.properties['P14'].name_inverse)) if origin.class_.name == 'acquisition': form.activity.choices.append( ('P22', g.properties['P22'].name_inverse)) form.activity.choices.append( ('P23', g.properties['P23'].name_inverse)) if form.validate_on_submit(): Transaction.begin() try: if origin.class_.view == 'event': for actor in Entity.get_by_ids( ast.literal_eval(form.actor.data)): link_ = Link.get_by_id( origin.link(form.activity.data, actor, form.description.data)[0]) link_.set_dates(process_form_dates(form)) link_.type = get_link_type(form) link_.update() else: for event in Entity.get_by_ids( ast.literal_eval(form.event.data)): link_ = Link.get_by_id( event.link(form.activity.data, origin, form.description.data)[0]) link_.set_dates(process_form_dates(form)) link_.type = get_link_type(form) link_.update() Transaction.commit() except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') if hasattr(form, 'continue_') and form.continue_.data == 'yes': return redirect(url_for('involvement_insert', origin_id=origin_id)) return redirect( f"{url_for('view', id_=origin.id)}" f"#tab-{'actor' if origin.class_.view == 'event' else 'event'}") return render_template('display_form.html', form=form, crumbs=[[ _(origin.class_.view), url_for('index', view=origin.class_.view) ], origin, _('involvement')])
def hierarchy_insert(param: str) -> Union[str, Response]: form = build_form('hierarchy', code=param) form.forms.choices = Node.get_form_choices() if form.validate_on_submit(): if Node.check_hierarchy_exists(form.name.data): flash(_('error name exists'), 'error') return render_template('display_form.html', form=form) save(form, param=param) flash(_('entity created'), 'info') return redirect(url_for('node_index') + '#menu-tab-' + param) return render_template( 'display_form.html', form=form, manual_page='entity/type', title=_('types'), crumbs=[[_('types'), url_for('node_index')], '+ ' + uc_first(_(param))])
def involvement_update(link_: Link, origin: Entity) -> Union[str, Response]: form = build_form('involvement', link_) form.activity.choices = [('P11', g.properties['P11'].name)] event = Entity.get_by_id(link_.domain.id) actor = Entity.get_by_id(link_.range.id) origin = event if origin.id == event.id else actor if event.class_.name in ['acquisition', 'activity']: form.activity.choices.append(('P14', g.properties['P14'].name)) if event.class_.name == 'acquisition': form.activity.choices.append(('P22', g.properties['P22'].name)) form.activity.choices.append(('P23', g.properties['P23'].name)) if form.validate_on_submit(): Transaction.begin() try: link_.delete() link_ = Link.get_by_id( event.link( form.activity.data, actor, form.description.data)[0]) link_.set_dates(process_form_dates(form)) link_.type = get_link_type(form) link_.update() Transaction.commit() except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') return redirect( f"{url_for('view', id_=origin.id)}" f"#tab-{'actor' if origin.class_.view == 'event' else 'event'}") form.save.label.text = _('save') form.activity.data = link_.property.code form.description.data = link_.description return render_template( 'display_form.html', origin=origin, form=form, crumbs=[ [_(origin.class_.view), url_for('index', view=origin.class_.view)], origin, event if origin.id != event.id else actor, _('edit')])
def insert(class_: str, origin_id: Optional[int] = None) -> Union[str, Response]: if class_ not in g.classes or not g.classes[class_].view \ or not is_authorized(g.classes[class_].write_access): abort(403) # pragma: no cover origin = Entity.get_by_id(origin_id) if origin_id else None form = build_form(class_, origin=origin) if form.validate_on_submit(): return redirect(save(form, class_=class_, origin=origin)) if hasattr(form, 'alias'): form.alias.append_entry('') view_name = g.classes[class_].view geonames_module = False if origin: populate_insert_form(form, view_name, class_, origin) else: geonames_module = True if ReferenceSystem.get_by_name( 'GeoNames').forms else False # Archaeological sub units structure = None gis_data = None overlays = None if view_name in ['artifact', 'place']: structure = get_structure(super_=origin) gis_data = Gis.get_all([origin] if origin else None, structure) overlays = Overlay.get_by_object(origin) \ if origin and origin.class_.view == 'place' else None return render_template( 'entity/insert.html', form=form, class_=class_, origin=origin, view_name=view_name, structure=structure, gis_data=gis_data, geonames_module=geonames_module, writeable=True if os.access(app.config['UPLOAD_DIR'], os.W_OK) else False, # For files overlays=overlays, title=_(view_name), crumbs=add_crumbs(view_name, class_, origin, structure, insert_=True))
def note_update(id_: int) -> Union[str, Response]: note = User.get_note_by_id(id_) if not note['user_id'] == current_user.id: abort(403) # pragma: no cover entity = Entity.get_by_id(note['entity_id']) form = build_form('note') if form.validate_on_submit(): User.update_note(note['id'], form.description.data, form.public.data) flash(_('note updated'), 'info') return redirect(f"{url_for('view', id_=note['entity_id'])}#tab-note") form.save.label.text = _('save') form.description.data = note['text'] form.public.data = note['public'] return render_template('display_form.html', form=form, entity=entity, crumbs=[[ _(entity.class_.view), url_for('index', view=entity.class_.view) ], entity, _('edit note')])
def member_insert(origin_id: int, code: str = 'member') -> Union[str, Response]: origin = Entity.get_by_id(origin_id) form = build_form('actor_function', code=code) form.member_origin_id.data = origin.id if form.validate_on_submit(): Transaction.begin() try: member_field = getattr(form, 'actor') \ if code == 'member' else getattr(form, 'group') for actor in Entity.get_by_ids(ast.literal_eval( member_field.data)): if code == 'membership': link_ = Link.get_by_id( actor.link('P107', origin, form.description.data)[0]) else: link_ = Link.get_by_id( origin.link('P107', actor, form.description.data)[0]) link_.set_dates(process_form_dates(form)) link_.type = get_link_type(form) link_.update() Transaction.commit() flash(_('entity created'), 'info') except Exception as e: # pragma: no cover Transaction.rollback() logger.log('error', 'database', 'transaction failed', e) flash(_('error transaction'), 'error') if hasattr(form, 'continue_') and form.continue_.data == 'yes': return redirect( url_for('member_insert', origin_id=origin_id, code=code)) return redirect(f"{url_for('view', id_=origin.id)}" f"#tab-member{'' if code == 'member' else '-of'}") return render_template( 'display_form.html', form=form, crumbs=[[_('actor'), url_for('index', view='actor')], origin, _('member')])
def update(id_: int) -> Union[str, Response]: entity = Entity.get_by_id(id_, nodes=True, aliases=True) if not entity.class_.view: abort(422) # pragma: no cover elif not is_authorized(entity.class_.write_access): abort(403) # pragma: no cover elif isinstance(entity, Node): root = g.nodes[entity.root[-1]] if entity.root else None if not root and (entity.standard or entity.locked): abort(403) # pragma: no cover # Archaeological sub units geonames_module = False if entity.class_.name == 'place' and ReferenceSystem.get_by_name( 'GeoNames').forms: geonames_module = True structure = None gis_data = None overlays = None location = None if entity.class_.view in ['artifact', 'place']: structure = get_structure(entity) location = entity.get_linked_entity_safe('P53', nodes=True) gis_data = Gis.get_all([entity], structure) overlays = Overlay.get_by_object(entity) form = build_form(entity.class_.name, entity, location=location) if entity.class_.view == 'event': form.event_id.data = entity.id elif isinstance(entity, ReferenceSystem) and entity.system: form.name.render_kw['readonly'] = 'readonly' if form.validate_on_submit(): if isinstance(entity, Node): valid = True root = g.nodes[entity.root[-1]] new_super_id = getattr(form, str(root.id)).data new_super = g.nodes[int(new_super_id)] if new_super_id else None if new_super: if new_super.id == entity.id: flash(_('error node self as super'), 'error') valid = False if new_super.root and entity.id in new_super.root: flash(_('error node sub as super'), 'error') valid = False if not valid: return redirect(url_for('entity_view', id_=entity.id)) if was_modified(form, entity): # pragma: no cover del form.save flash(_('error modified'), 'error') return render_template('entity/update.html', form=form, entity=entity, structure=structure, modifier=link( logger.get_log_for_advanced_view( entity.id)['modifier'])) return redirect(save(form, entity)) populate_update_form(form, entity) return render_template('entity/update.html', form=form, entity=entity, structure=structure, gis_data=gis_data, overlays=overlays, geonames_module=geonames_module, title=entity.name, crumbs=add_crumbs(view_name=entity.class_.view, class_=entity.class_.name, origin=entity, structure=structure))