def node_view(id_): from openatlas.models.linkProperty import LinkPropertyMapper node = g.nodes[id_] root = g.nodes[node.root[-1]] if node.root else None super_ = g.nodes[node.root[0]] if node.root else None header = [_('name'), _('class'), _('info')] if root and root.value_type: # pragma: no cover header = [_('name'), _('value'), _('class'), _('info')] tables = {'entities': {'id': 'entities', 'header': header, 'data': []}, 'info': get_entity_data(node)} for entity in node.get_linked_entities(['P2', 'P89'], True): # If it is a place location get the corresponding object entity = entity if node.class_.code == 'E55' else entity.get_linked_entity('P53', True) if entity: # If not entity it is a place node, so do not add data = [link(entity)] if root and root.value_type: # pragma: no cover data.append(format_number(entity.nodes[node])) data.append(g.classes[entity.class_.code].name) data.append(truncate_string(entity.description)) tables['entities']['data'].append(data) tables['link_entities'] = {'id': 'link_items', 'header': [_('domain'), _('range')], 'data': []} for row in LinkPropertyMapper.get_entities_by_node(node): tables['link_entities']['data'].append([link(EntityMapper.get_by_id(row.domain_id)), link(EntityMapper.get_by_id(row.range_id))]) tables['subs'] = {'id': 'subs', 'header': [_('name'), _('count'), _('info')], 'data': []} for sub_id in node.subs: sub = g.nodes[sub_id] tables['subs']['data'].append([link(sub), sub.count, truncate_string(sub.description)]) return render_template('types/view.html', node=node, super_=super_, tables=tables, root=root)
def admin_check_dates() -> str: # Get invalid date combinations (e.g. begin after end) tables = {'link_dates': Table(['link', 'domain', 'range']), 'involvement_dates': Table(['actor', 'event', 'class', 'involvement', 'description']), 'dates': Table(['name', 'class', 'type', 'system type', 'created', 'updated', 'description'])} for entity in DateMapper.get_invalid_dates(): tables['dates'].rows.append([link(entity), link(entity.class_), entity.print_base_type(), entity.system_type, format_date(entity.created), format_date(entity.modified), truncate_string(entity.description)]) for link_ in DateMapper.get_invalid_link_dates(): label = '' if link_.property.code == 'OA7': # pragma: no cover label = 'relation' elif link_.property.code == 'P107': # pragma: no cover label = 'member' elif link_.property.code in ['P11', 'P14', 'P22', 'P23']: label = 'involvement' url = url_for(label + '_update', id_=link_.id, origin_id=link_.domain.id) tables['link_dates'].rows.append(['<a href="' + url + '">' + uc_first(_(label)) + '</a>', link(link_.domain), link(link_.range)]) for link_ in DateMapper.invalid_involvement_dates(): event = link_.domain actor = link_.range update_url = url_for('involvement_update', id_=link_.id, origin_id=actor.id) data = ([link(actor), link(event), g.classes[event.class_.code].name, link_.type.name if link_.type else '', truncate_string(link_.description), '<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>']) tables['involvement_dates'].rows.append(data) return render_template('admin/check_dates.html', tables=tables)
def admin_check_link_duplicates(delete: Optional[str] = None) -> str: if delete: delete_count = str(LinkMapper.delete_link_duplicates()) logger.log('info', 'admin', 'Deleted duplicate links: ' + delete_count) flash(_('deleted links') + ': ' + delete_count, 'info') return redirect(url_for('admin_check_link_duplicates')) table = Table(['domain', 'range', 'property_code', 'description', 'type_id', 'begin_from', 'begin_to', 'begin_comment', 'end_from', 'end_to', 'end_comment', 'count']) for result in LinkMapper.check_link_duplicates(): table.rows.append([link(EntityMapper.get_by_id(result.domain_id)), link(EntityMapper.get_by_id(result.range_id)), link(g.properties[result.property_code]), truncate_string(result.description), link(g.nodes[result.type_id]) if result.type_id else '', format_date(result.begin_from), format_date(result.begin_to), truncate_string(result.begin_comment), format_date(result.end_from), format_date(result.end_to), truncate_string(result.end_comment), result.count]) duplicates = False if table.rows: duplicates = True else: # If no exact duplicates where found check if single types are used multiple times table = Table(['entity', 'class', 'base type', 'incorrect multiple types'], rows=LinkMapper.check_single_type_duplicates()) return render_template('admin/check_link_duplicates.html', table=table, duplicates=duplicates)
def get_network_json(params): """ Returns JSON data for d3.js""" classes = [] for code, param in params['classes'].items(): if param['active']: classes.append(code) properties = [] for code, param in params['properties'].items(): if param['active']: properties.append(code) sql = "SELECT domain_id, range_id FROM model.link WHERE property_code IN %(properties)s;" g.cursor.execute(sql, {'properties': tuple(properties)}) entities = set() edges = '' for row in g.cursor.fetchall(): # pragma: no cover if row.domain_id == row.range_id: continue # Prevent circular dependencies edges += "{'source': '" + str(row.domain_id) edges += "', 'target': '" + str(row.range_id) + "' }," entities.add(row.domain_id) entities.add(row.range_id) edges = " links: [" + edges + "]" nodes = '' entities_already = set() sql = "SELECT id, class_code, name FROM model.entity WHERE class_code IN %(classes)s;" g.cursor.execute(sql, {'classes': tuple(classes)}) for row in g.cursor.fetchall(): if params['options']['orphans'] or row.id in entities: name = row.name.replace("'", "").replace('Location of ', '').replace('\n', ' ')\ .replace('\r', ' ') entities_already.add(row.id) nodes += "{'id':'" + str( row.id) + "', 'name':'" + truncate_string(name, span=False) nodes += "', 'color':'" + params['classes'][ row.class_code]['color'] + "'}," # Get elements of links which weren't present in class selection array_diff = [ item for item in entities if item not in entities_already ] if array_diff: sql = "SELECT id, class_code, name FROM model.entity WHERE id IN %(array_diff)s;" g.cursor.execute(sql, {'array_diff': tuple(array_diff)}) result = g.cursor.fetchall() for row in result: color = '' if row.class_code in params['classes']: # pragma: no cover color = params['classes'][row.class_code]['color'] name = row.name.replace("'", "").replace('Location of ', '').replace('\n', ' ')\ .replace('\r', ' ') nodes += "{'id':'" + str( row.id) + "', 'name':'" + truncate_string(name, span=False) nodes += "', 'color':'" + color + "'}," return "graph = {'nodes': [" + nodes + "], " + edges + "};"
def get_network_json(params): """ Returns JSON data for d3.js""" properties = [code for code, param in params['properties'].items() if param['active']] classes = [code for code, param in params['classes'].items() if param['active']] if not classes: return None # Return nothing if no classes are selected # Get edges entities = set() edges = '' if properties: sql = """ SELECT l.domain_id, l.range_id FROM model.link l JOIN model.entity e ON l.domain_id = e.id WHERE property_code IN %(properties)s AND (e.system_type IS NULL OR e.system_type != 'file');""" g.cursor.execute(sql, {'properties': tuple(properties)}) debug_model['div sql'] += 1 for row in g.cursor.fetchall(): edges += "{{'source':'{domain_id}','target':'{range_id}'}},".format( domain_id=row.domain_id, range_id=row.range_id) entities.update([row.domain_id, row.range_id]) # Get entities sql = "SELECT id, class_code, name FROM model.entity WHERE class_code IN %(classes)s;" g.cursor.execute(sql, {'classes': tuple(classes)}) debug_model['div sql'] += 1 nodes = '' entities_already = set() for row in g.cursor.fetchall(): if params['options']['orphans'] or row.id in entities: entities_already.add(row.id) nodes += """{{'id':'{id}','name':'{name}','color':'{color}'}},""".format( id=row.id, name=truncate_string(row.name.replace("'", ""), span=False), color=params['classes'][row.class_code]['color']) # Get entities of links which weren't present in class selection array_diff = [item for item in entities if item not in entities_already] if array_diff: sql = "SELECT id, class_code, name FROM model.entity WHERE id IN %(array_diff)s;" g.cursor.execute(sql, {'array_diff': tuple(array_diff)}) debug_model['div sql'] += 1 result = g.cursor.fetchall() for row in result: color = '' if row.class_code in params['classes']: # pragma: no cover color = params['classes'][row.class_code]['color'] nodes += """{{'id':'{id}','name':'{name}','color':'{color}'}},""".format( id=row.id, color=color, name=truncate_string(row.name.replace("'", ""), span=False)) return "graph = {'nodes': [" + nodes + "], links: [" + edges + "]};" if nodes else None
def event_view(id_): event = EntityMapper.get_by_id(id_) event.set_dates() tables = { 'info': get_entity_data(event), 'file': {'id': 'files', 'data': [], 'header': app.config['TABLE_HEADERS']['file'] + [_('main image')]}, 'subs': {'id': 'sub-event', 'data': [], 'header': app.config['TABLE_HEADERS']['event']}, 'source': {'id': 'source', 'data': [], 'header': app.config['TABLE_HEADERS']['source']}, 'actor': {'id': 'actor', 'data': [], 'header': ['actor', 'class', 'involvement', 'first', 'last', 'description']}, 'reference': {'id': 'reference', 'data': [], 'header': app.config['TABLE_HEADERS']['reference'] + ['pages']}} for link_ in event.get_links(['P11', 'P14', 'P22', 'P23']): first = link_.first if not link_.first and event.first: first = '<span class="inactive" style="float:right">' + str(event.first) + '</span>' last = link_.last if not link_.last and event.last: last = '<span class="inactive" style="float:right">' + str(event.last) + '</span>' data = ([link(link_.range), g.classes[link_.range.class_.code].name, link_.type.name if link_.type else '', first, last, truncate_string(link_.description)]) if is_authorized('editor'): update_url = url_for('involvement_update', id_=link_.id, origin_id=event.id) unlink_url = url_for('link_delete', id_=link_.id, origin_id=event.id) + '#tab-actor' data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') data.append(display_remove_link(unlink_url, link_.range.name)) tables['actor']['data'].append(data) profile_image_id = event.get_profile_image_id() for link_ in event.get_links('P67', True): domain = link_.domain data = get_base_table_data(domain) if domain.view_name == 'file': # pragma: no cover extension = data[3].replace('.', '') data.append(get_profile_image_table_link(domain, event, extension, profile_image_id)) if not profile_image_id and extension in app.config['DISPLAY_FILE_EXTENSIONS']: profile_image_id = domain.id if domain.view_name not in ['source', 'file']: data.append(truncate_string(link_.description)) if is_authorized('editor'): update_url = url_for('reference_link_update', link_id=link_.id, origin_id=event.id) data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') if is_authorized('editor'): url = url_for('link_delete', id_=link_.id, origin_id=event.id) data.append(display_remove_link(url + '#tab-' + domain.view_name, domain.name)) tables[domain.view_name]['data'].append(data) for sub_event in event.get_linked_entities('P117', True): tables['subs']['data'].append(get_base_table_data(sub_event)) return render_template('event/view.html', event=event, tables=tables, profile_image_id=profile_image_id)
def get_network_json(params): """ Returns JSON data for d3.js""" properties = [code for code, param in params['properties'].items() if param['active']] classes = [code for code, param in params['classes'].items() if param['active']] if not classes: return None # Get edges entities = set() edges = '' if properties: sql = """ SELECT l.domain_id, l.range_id FROM model.link l JOIN model.entity e ON l.domain_id = e.id WHERE property_code IN %(properties)s AND (e.system_type IS NULL OR e.system_type != 'file');""" g.execute(sql, {'properties': tuple(properties)}) for row in g.cursor.fetchall(): edges += "{{'source':'{domain_id}','target':'{range_id}'}},".format( domain_id=row.domain_id, range_id=row.range_id) entities.update([row.domain_id, row.range_id]) # Get entities sql = "SELECT id, class_code, name FROM model.entity WHERE class_code IN %(classes)s;" g.execute(sql, {'classes': tuple(classes)}) nodes = '' entities_already = set() for row in g.cursor.fetchall(): if params['options']['orphans'] or row.id in entities: entities_already.add(row.id) nodes += """{{'id':'{id}','name':'{name}','color':'{color}'}},""".format( id=row.id, name=truncate_string(row.name.replace("'", ""), span=False), color=params['classes'][row.class_code]['color']) # Get entities of links which weren't present in class selection array_diff = [item for item in entities if item not in entities_already] if array_diff: sql = "SELECT id, class_code, name FROM model.entity WHERE id IN %(array_diff)s;" g.execute(sql, {'array_diff': tuple(array_diff)}) result = g.cursor.fetchall() for row in result: color = '' if row.class_code in params['classes']: # pragma: no cover color = params['classes'][row.class_code]['color'] nodes += """{{'id':'{id}','name':'{name}','color':'{color}'}},""".format( id=row.id, color=color, name=truncate_string(row.name.replace("'", ""), span=False)) return "graph = {'nodes': [" + nodes + "], links: [" + edges + "]};" if nodes else None
def admin_orphans() -> str: header = ['name', 'class', 'type', 'system type', 'created', 'updated', 'description'] tables = {'orphans': Table(header), 'unlinked': Table(header), 'missing_files': Table(header), 'circular': Table(['entity']), 'nodes': Table(['name', 'root']), 'orphaned_files': Table(['name', 'size', 'date', 'ext'])} tables['circular'].rows = [[link(entity)] for entity in EntityMapper.get_circular()] for entity in EntityMapper.get_orphans(): name = 'unlinked' if entity.class_.code in app.config['CODE_CLASS'].keys() else 'orphans' tables[name].rows.append([link(entity), link(entity.class_), entity.print_base_type(), entity.system_type, format_date(entity.created), format_date(entity.modified), truncate_string(entity.description)]) for node in NodeMapper.get_orphans(): tables['nodes'].rows.append([link(node), link(g.nodes[node.root[-1]])]) # Get orphaned file entities (no corresponding file) file_ids = [] for entity in EntityMapper.get_by_system_type('file', nodes=True): file_ids.append(str(entity.id)) if not get_file_path(entity): tables['missing_files'].rows.append([link(entity), link(entity.class_), entity.print_base_type(), entity.system_type, format_date(entity.created), format_date(entity.modified), truncate_string(entity.description)]) # Get orphaned files (no corresponding entity) for file in os.scandir(app.config['UPLOAD_FOLDER_PATH']): name = file.name if name != '.gitignore' and splitext(file.name)[0] not in file_ids: confirm = ' onclick="return confirm(\'' + _('Delete %(name)s?', name=name) + '\')"' tables['orphaned_files'].rows.append([ name, convert_size(file.stat().st_size), format_date(datetime.datetime.utcfromtimestamp(file.stat().st_ctime)), splitext(name)[1], '<a href="' + url_for('download_file', filename=name) + '">' + uc_first( _('download')) + '</a>', '<a href="' + url_for('admin_file_delete', filename=name) + '" ' + confirm + '>' + uc_first(_('delete')) + '</a>']) return render_template('admin/orphans.html', tables=tables)
def reference_index() -> str: table = Table(Table.HEADERS['reference'] + ['description']) for reference in EntityMapper.get_by_codes('reference'): data = get_base_table_data(reference) data.append(truncate_string(reference.description)) table.rows.append(data) return render_template('reference/index.html', table=table)
def file_index() -> str: table = Table(['date'] + Table.HEADERS['file']) file_stats = get_file_stats() for entity in EntityMapper.get_by_system_type('file', nodes=True): date = 'N/A' if entity.id in file_stats: date = format_date( datetime.datetime.utcfromtimestamp( file_stats[entity.id]['date'])) table.rows.append([ date, link(entity), entity.print_base_type(), convert_size(file_stats[entity.id]['size']) if entity.id in file_stats else 'N/A', file_stats[entity.id]['ext'] if entity.id in file_stats else 'N/A', truncate_string(entity.description) ]) if os.name != "posix": # pragma: no cover # For other operating systems e.g. Windows, we would need adaptions here return render_template('file/index.html', table=table, disk_space_values={}) statvfs = os.statvfs(app.config['UPLOAD_FOLDER_PATH']) disk_space = statvfs.f_frsize * statvfs.f_blocks free_space = statvfs.f_frsize * statvfs.f_bavail # Available space without reserved blocks disk_space_values = { 'total': convert_size(statvfs.f_frsize * statvfs.f_blocks), 'free': convert_size(statvfs.f_frsize * statvfs.f_bavail), 'percent': 100 - math.ceil(free_space / (disk_space / 100)) } return render_template('file/index.html', table=table, disk_space_values=disk_space_values)
def reference_view(id_): reference = EntityMapper.get_by_id(id_) tables = { 'info': get_entity_data(reference), 'file': {'id': 'files', 'data': [], 'header': app.config['TABLE_HEADERS']['file'] + ['page'] + [_('main image')]}} for name in ['source', 'event', 'actor', 'place', 'feature', 'stratigraphic-unit', 'find']: header = app.config['TABLE_HEADERS'][name] + ['page'] tables[name] = {'id': name, 'header': header, 'data': []} for link_ in reference.get_links('P67', True): domain = link_.domain data = get_base_table_data(domain) if is_authorized('editor'): url = url_for('link_delete', id_=link_.id, origin_id=reference.id) + '#tab-file' data.append(display_remove_link(url, domain.name)) tables['file']['data'].append(data) profile_image_id = reference.get_profile_image_id() for link_ in reference.get_links(['P67', 'P128']): range_ = link_.range data = get_base_table_data(range_) data.append(truncate_string(link_.description)) if range_.view_name == 'file': # pragma: no cover ext = data[3].replace('.', '') data.append(get_profile_image_table_link(range_, reference, ext, profile_image_id)) if not profile_image_id and ext in app.config['DISPLAY_FILE_EXTENSIONS']: profile_image_id = range_.id if is_authorized('editor'): url = url_for('reference_link_update', link_id=link_.id, origin_id=reference.id) data.append('<a href="' + url + '">' + uc_first(_('edit')) + '</a>') url = url_for('link_delete', id_=link_.id, origin_id=reference.id) data.append(display_remove_link(url + '#tab-' + range_.table_name, range_.name)) tables[range_.table_name]['data'].append(data) return render_template('reference/view.html', reference=reference, tables=tables, profile_image_id=profile_image_id)
def object_index() -> str: table = Table(Table.HEADERS['object'] + ['description']) for object_ in EntityMapper.get_by_codes('object'): data = get_base_table_data(object_) data.append(truncate_string(object_.description)) table.rows.append(data) return render_template('object/index.html', table=table)
def index() -> str: tables = {'overview': Table(paging=False, defs='[{className: "dt-body-right", targets: 1}]'), 'bookmarks': Table(['name', 'class', 'first', 'last'], defs='[{className: "dt-body-right", targets: [2,3]}]'), 'notes': Table(['name', 'class', 'first', 'last', _('note')], defs='[{className: "dt-body-right", targets: [2,3]}]'), 'latest': Table(['name', 'class', 'first', 'last', 'date', 'user'], order='[[4, "desc"]]', defs='[{className: "dt-body-right", targets: [2,3]}]')} if current_user.is_authenticated and hasattr(current_user, 'bookmarks'): for entity_id in current_user.bookmarks: entity = EntityMapper.get_by_id(entity_id) tables['bookmarks'].rows.append([link(entity), g.classes[entity.class_.code].name, entity.first, entity.last, bookmark_toggle(entity.id, True)]) for entity_id, text in UserMapper.get_notes().items(): entity = EntityMapper.get_by_id(entity_id) tables['notes'].rows.append([link(entity), g.classes[entity.class_.code].name, entity.first, entity.last, truncate_string(text)]) for name, count in EntityMapper.get_overview_counts().items(): if count: count = format_number(count) if count else '' url = url_for(name + '_index') if name != 'find' else url_for('place_index') tables['overview'].rows.append([ '<a href="' + url + '">' + uc_first(_(name)) + '</a>', count]) for entity in EntityMapper.get_latest(8): tables['latest'].rows.append([ link(entity), g.classes[entity.class_.code].name, entity.first, entity.last, format_date(entity.created), link(logger.get_log_for_advanced_view(entity.id)['creator'])]) intro = ContentMapper.get_translation('intro') return render_template('index/index.html', intro=intro, tables=tables)
def __call__(self, field, **kwargs): file_stats = None class_ = 'place' if field.id in ['residence', 'begins_in', 'ends_in'] else field.id if class_ == 'place': aliases = current_user.settings['table_show_aliases'] entities = EntityMapper.get_by_system_type('place', nodes=True, aliases=aliases) elif class_ == 'reference': entities = EntityMapper.get_by_system_type('bibliography') + \ EntityMapper.get_by_system_type('edition') + \ EntityMapper.get_by_system_type('external reference') elif class_ == 'file': entities = EntityMapper.get_display_files() file_stats = get_file_stats() else: entities = EntityMapper.get_by_codes(class_) selection = '' table = Table(Table.HEADERS[class_]) for entity in entities: # Todo: don't show self e.g. at source if field.data and entity.id == int(field.data): selection = entity.name data = get_base_table_data(entity, file_stats) data[0] = """<a onclick="selectFromTable(this,'{name}', {entity_id})">{entity_name}</a> """.format(name=field.id, entity_id=entity.id, entity_name=truncate_string(entity.name, span=False)) data[0] = '<br />'.join([data[0]] + [ truncate_string(alias) for id_, alias in entity.aliases.items()]) table.rows.append(data) html = """ <input id="{name}-button" name="{name}-button" class="table-select {required}" type="text" placeholder="{change_label}" onfocus="this.blur()" readonly="readonly" value="{selection}"> <a id="{name}-clear" class="button" {clear_style} onclick="clearSelect('{name}');">{clear_label}</a> <div id="{name}-overlay" class="overlay"> <div id="{name}-dialog" class="overlay-container">{table}</div></div> <script>$(document).ready(function () {{createOverlay("{name}", "{title}");}});</script> """.format(name=field.id, title=_(field.id.replace('_', ' ')), change_label=uc_first(_('change')), clear_label=uc_first(_('clear')), table=table.display(field.id), selection=selection, clear_style='' if selection else ' style="display: none;" ', required=' required' if field.flags.required else '') return super(TableSelect, self).__call__(field, **kwargs) + html
def reference_index(): header = app.config['TABLE_HEADERS']['reference'] + ['description'] table = {'id': 'reference', 'header': header, 'data': []} for reference in EntityMapper.get_by_codes('reference'): data = get_base_table_data(reference) data.append(truncate_string(reference.description)) table['data'].append(data) return render_template('reference/index.html', table=table)
def event_index() -> str: table = Table(Table.HEADERS['event'] + ['description'], defs='[{className: "dt-body-right", targets: [3,4]}]') for event in EntityMapper.get_by_codes('event'): data = get_base_table_data(event) data.append(truncate_string(event.description)) table.rows.append(data) return render_template('event/index.html', table=table)
def actor_index() -> str: table = Table(Table.HEADERS['actor'] + ['description'], defs='[{className: "dt-body-right", targets: [2,3]}]') for actor in EntityMapper.get_by_codes('actor'): data = get_base_table_data(actor) data.append(truncate_string(actor.description)) table.rows.append(data) return render_template('actor/index.html', table=table)
def event_index(): header = app.config['TABLE_HEADERS']['event'] + ['description'] table = {'id': 'event', 'header': header, 'data': []} for event in EntityMapper.get_by_codes('event'): data = get_base_table_data(event) data.append(truncate_string(event.description)) table['data'].append(data) return render_template('event/index.html', table=table)
def reference_index(): header = app.config['TABLE_HEADERS']['reference'] + ['description'] table = {'id': 'reference', 'header': header, 'data': []} for reference in EntityMapper.get_by_codes('reference'): data = get_base_table_data(reference) data.append(truncate_string(reference.description)) table['data'].append(data) return render_template('reference/index.html', table=table)
def actor_index(): header = app.config['TABLE_HEADERS']['actor'] + ['description'] table = {'id': 'actor', 'header': header, 'data': []} for actor in EntityMapper.get_by_codes('actor'): data = get_base_table_data(actor) data.append(truncate_string(actor.description)) table['data'].append(data) return render_template('actor/index.html', table=table)
def import_index(): table = {'id': 'project', 'header': [_('project'), _('entities'), _('description')], 'data': []} for project in ImportMapper.get_all_projects(): table['data'].append([ link(project), format_number(project.count), truncate_string(project.description)]) return render_template('import/index.html', table=table)
def node_view(id_): from openatlas.models.linkProperty import LinkPropertyMapper node = g.nodes[id_] root = g.nodes[node.root[-1]] if node.root else None super_ = g.nodes[node.root[0]] if node.root else None tables = { 'entities': { 'id': 'entities', 'header': [_('name'), _('class'), _('info')], 'data': [] } } for entity in node.get_linked_entities(['P2', 'P89'], True): # If it is a place location get the corresponding object entity = entity if node.class_.code == 'E55' else entity.get_linked_entity( 'P53', True) if entity: # If not entity it is a place node, so do not add tables['entities']['data'].append([ link(entity), g.classes[entity.class_.code].name, truncate_string(entity.description) ]) tables['link_entities'] = { 'id': 'link_entities', 'header': [_('domain'), _('range')], 'data': [] } for row in LinkPropertyMapper.get_entities_by_node(node): tables['link_entities']['data'].append([ link(EntityMapper.get_by_id(row.domain_id)), link(EntityMapper.get_by_id(row.range_id)) ]) tables['subs'] = { 'id': 'subs', 'header': [_('name'), _('count'), _('info')], 'data': [] } for sub_id in node.subs: sub = g.nodes[sub_id] tables['subs']['data'].append( [link(sub), sub.count, truncate_string(sub.description)]) return render_template('types/view.html', node=node, super_=super_, tables=tables, root=root)
def actor_index(): header = app.config['TABLE_HEADERS']['actor'] + ['description'] table = {'id': 'actor', 'header': header, 'data': []} for actor in EntityMapper.get_by_codes('actor'): data = get_base_table_data(actor) data.append(truncate_string(actor.description)) table['data'].append(data) return render_template('actor/index.html', table=table)
def event_index(): header = app.config['TABLE_HEADERS']['event'] + ['description'] table = {'id': 'event', 'header': header, 'data': []} for event in EntityMapper.get_by_codes('event'): data = get_base_table_data(event) data.append(truncate_string(event.description)) table['data'].append(data) return render_template('event/index.html', table=table)
def build_search_table(form) -> Table: table = Table(['name', 'class', 'first', 'last', 'description'], defs='[{className: "dt-body-right", targets: [2,3]}]') for entity in EntityMapper.search(form): table.rows.append([ link(entity), entity.class_.name, entity.first, entity.last, truncate_string(entity.description) ]) return table
def import_index() -> str: table = Table([_('project'), _('entities'), _('description')]) for project in ImportMapper.get_all_projects(): table.rows.append([ link(project), format_number(project.count), truncate_string(project.description) ]) return render_template('import/index.html', table=table)
def import_project_view(id_): table = {'id': 'entities', 'data': [], 'header': [_('name'), _('class'), _('description'), 'origin ID', _('date')]} for entity in EntityMapper.get_by_project_id(id_): table['data'].append([ link(entity), entity.class_.name, truncate_string(entity.description), entity.origin_id, format_date(entity.created)]) project = ImportMapper.get_project_by_id(id_) return render_template('import/project_view.html', project=project, table=table)
def node_view(id_: int) -> str: from openatlas.models.link import LinkMapper node = g.nodes[id_] root = g.nodes[node.root[-1]] if node.root else None super_ = g.nodes[node.root[0]] if node.root else None header = [_('name'), _('class'), _('info')] if root and root.value_type: # pragma: no cover header = [_('name'), _('value'), _('class'), _('info')] tables = {'info': get_entity_data(node), 'entities': Table(header)} for entity in node.get_linked_entities(['P2', 'P89'], inverse=True, nodes=True): # If it is a place location get the corresponding object entity = entity if node.class_.code == 'E55' else entity.get_linked_entity( 'P53', True) if entity: # If not entity it is a place node, so do not add data = [link(entity)] if root and root.value_type: # pragma: no cover data.append(format_number(entity.nodes[node])) data.append(g.classes[entity.class_.code].name) data.append(truncate_string(entity.description)) tables['entities'].rows.append(data) tables['link_entities'] = Table([_('domain'), _('range')]) for row in LinkMapper.get_entities_by_node(node): tables['link_entities'].rows.append([ link(EntityMapper.get_by_id(row.domain_id)), link(EntityMapper.get_by_id(row.range_id)) ]) tables['subs'] = Table([_('name'), _('count'), _('info')]) for sub_id in node.subs: sub = g.nodes[sub_id] tables['subs'].rows.append( [link(sub), sub.count, truncate_string(sub.description)]) return render_template('types/view.html', node=node, super_=super_, tables=tables, root=root)
def reference_view(id_: int) -> str: reference = EntityMapper.get_by_id(id_, nodes=True) reference.note = UserMapper.get_note(reference) tables = { 'info': get_entity_data(reference), 'file': Table(Table.HEADERS['file'] + ['page', _('main image')]) } for name in [ 'source', 'event', 'actor', 'place', 'feature', 'stratigraphic-unit', 'find' ]: header_label = 'link text' if reference.system_type == 'external reference' else 'page' tables[name] = Table(Table.HEADERS[name] + [header_label]) for link_ in reference.get_links('P67', True): domain = link_.domain data = get_base_table_data(domain) if is_authorized('contributor'): url = url_for('link_delete', id_=link_.id, origin_id=reference.id) + '#tab-file' data.append(display_remove_link(url, domain.name)) tables['file'].rows.append(data) profile_image_id = reference.get_profile_image_id() for link_ in reference.get_links(['P67', 'P128']): range_ = link_.range data = get_base_table_data(range_) data.append(truncate_string(link_.description)) if range_.view_name == 'file': # pragma: no cover ext = data[3].replace('.', '') data.append( get_profile_image_table_link(range_, reference, ext, profile_image_id)) if not profile_image_id and ext in app.config[ 'DISPLAY_FILE_EXTENSIONS']: profile_image_id = range_.id if is_authorized('contributor'): url = url_for('reference_link_update', link_id=link_.id, origin_id=reference.id) data.append('<a href="' + url + '">' + uc_first(_('edit')) + '</a>') url = url_for('link_delete', id_=link_.id, origin_id=reference.id) data.append( display_remove_link(url + '#tab-' + range_.table_name, range_.name)) tables[range_.table_name].rows.append(data) return render_template('reference/view.html', reference=reference, tables=tables, profile_image_id=profile_image_id)
def import_project_view(id_: int) -> str: table = Table( [_('name'), _('class'), _('description'), 'origin ID', _('date')]) for entity in EntityMapper.get_by_project_id(id_): table.rows.append([ link(entity), entity.class_.name, truncate_string(entity.description), entity.origin_id, format_date(entity.created) ]) project = ImportMapper.get_project_by_id(id_) return render_template('import/project_view.html', project=project, table=table)
def __call__(self, field, **kwargs): selection = '' class_ = field.id if class_ in ['residence', 'begins_in', 'ends_in']: class_ = 'place' header = app.config['TABLE_HEADERS'][class_] table = {'id': field.id, 'header': header, 'data': []} file_stats = None if class_ == 'place': entities = EntityMapper.get_by_system_type('place') elif class_ == 'reference': entities = EntityMapper.get_by_system_type('bibliography') + \ EntityMapper.get_by_system_type('edition') + \ EntityMapper.get_by_system_type('external reference') elif class_ == 'file': entities = EntityMapper.get_display_files() file_stats = get_file_stats() else: entities = EntityMapper.get_by_codes(class_) for entity in entities: # Todo: don't show self e.g. at source if field.data and entity.id == int(field.data): selection = entity.name data = get_base_table_data(entity, file_stats) data[0] = """<a onclick="selectFromTable(this,'{name}', {entity_id})">{entity_name}</a> """.format(name=field.id, entity_id=entity.id, entity_name=truncate_string(entity.name, span=False)) table['data'].append(data) html = """ <input id="{name}-button" name="{name}-button" class="table-select {required}" type="text" placeholder="{change_label}" onfocus="this.blur()" readonly="readonly" value="{selection}"> <a id="{name}-clear" class="button" {clear_style} onclick="clearSelect('{name}');">{clear_label}</a> <div id="{name}-overlay" class="overlay"> <div id="{name}-dialog" class="overlay-container">{pager}</div></div> <script>$(document).ready(function () {{createOverlay("{name}", "{title}");}});</script> """.format(name=field.id, title=_(field.id.replace('_', ' ')), change_label=uc_first(_('change')), clear_label=uc_first(_('clear')), pager=pager(table), selection=selection, clear_style='' if selection else ' style="display: none;" ', required=' required' if field.flags.required else '') return super(TableSelect, self).__call__(field, **kwargs) + html
def reference_view(id_, unlink_id=None): reference = EntityMapper.get_by_id(id_) if unlink_id: LinkMapper.delete_by_id(unlink_id) flash(_('link removed'), 'info') tables = { 'info': get_entity_data(reference), 'file': { 'id': 'files', 'data': [], 'header': app.config['TABLE_HEADERS']['file'] + ['page'] } } for name in [ 'source', 'event', 'actor', 'place', 'feature', 'stratigraphic-unit', 'find' ]: header = app.config['TABLE_HEADERS'][name] + ['page'] tables[name] = {'id': name, 'header': header, 'data': []} for link_ in reference.get_links('P67', True): data = get_base_table_data(link_.domain) if is_authorized('editor'): unlink = url_for('reference_view', id_=reference.id, unlink_id=link_.id) + '#tab-file' data.append(display_remove_link(unlink, link_.domain.name)) tables['file']['data'].append(data) for link_ in reference.get_links(['P67', 'P128']): view_name = get_view_name(link_.range) view_name = view_name if view_name != 'place' else link_.range.system_type.replace( ' ', '-') data = get_base_table_data(link_.range) data.append(truncate_string(link_.description)) if is_authorized('editor'): update_url = url_for('reference_link_update', link_id=link_.id, origin_id=reference.id) data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') unlink_url = url_for('reference_view', id_=reference.id, unlink_id=link_.id) + '#tab-' + view_name data.append(display_remove_link(unlink_url, link_.range.name)) tables[view_name]['data'].append(data) return render_template('reference/view.html', reference=reference, tables=tables)
def display_external_references(self, entity) -> str: """ Formats external references for display.""" html = '' for link_ in entity.external_references: url = link_.domain.name name = util.truncate_string(url.replace('http://', '').replace('https://', ''), span=False) if link_.description: name = link_.description if link_.domain.system_type == 'external reference geonames': name = 'GeoNames (' + link_.domain.name + ')' url = app.config['GEONAMES_VIEW_URL'] + link_.domain.name html += '<a target="_blank" href="{url}">{name}</a><br />'.format( url=url, name=name) return '<h2>' + util.uc_first( _('external references')) + '</h2>' + html if html else ''
def __call__(self, field, **kwargs): selection = '' class_ = field.id if class_ in ['residence', 'appears_first', 'appears_last']: class_ = 'place' header = app.config['TABLE_HEADERS'][class_] table = {'id': field.id, 'header': header, 'data': []} if class_ == 'place': entities = EntityMapper.get_by_system_type('place') elif class_ == 'reference': entities = EntityMapper.get_by_system_type('bibliography') + \ EntityMapper.get_by_system_type('edition') elif class_ == 'file': entities = EntityMapper.get_by_system_type('file') else: entities = EntityMapper.get_by_codes(class_) for entity in entities: # Todo: don't show self e.g. at source if field.data and entity.id == int(field.data): selection = entity.name data = get_base_table_data(entity) data[0] = """<a onclick="selectFromTable(this,'{name}', {entity_id})">{entity_name}</a> """.format( name=field.id, entity_id=entity.id, entity_name=truncate_string(entity.name, span=False)) table['data'].append(data) html = """ <input id="{name}-button" name="{name}-button" class="table-select {required}" type="text" placeholder="{change_label}" onfocus="this.blur()" readonly="readonly" value="{selection}"> <a id="{name}-clear" class="button" {clear_style} onclick="clearSelect('{name}');">{clear_label}</a> <div id="{name}-overlay" class="overlay"> <div id="{name}-dialog" class="overlay-container">{pager}</div></div> <script>$(document).ready(function () {{createOverlay("{name}", "{title}");}});</script> """.format( name=field.id, title=_(field.id.replace('_', ' ')), change_label=uc_first(_('change')), clear_label=uc_first(_('clear')), pager=pager(table), selection=selection, clear_style='' if selection else ' style="display: none;" ', required=' required' if field.flags.required else '') return super(TableSelect, self).__call__(field, **kwargs) + html
def __call__(self, field, **kwargs): if field.data and isinstance(field.data, str): field.data = ast.literal_eval(field.data) selection = '' class_ = field.id if class_ in ['donor', 'recipient']: class_ = 'actor' if class_ in ['given_place']: class_ = 'place' table = { 'id': field.id, 'header': app.config['TABLE_HEADERS'][class_], 'data': []} # Make checkbox column sortable and show selected on top table['headers'] = 'headers: { ' + str(len(table['header'])) + ': { sorter: "checkbox" } }' table['sort'] = 'sortList: [[' + str(len(table['header'])) + ',0],[0,0]]' if class_ == 'place': entities = EntityMapper.get_by_system_type('place') else: entities = EntityMapper.get_by_codes(class_) for entity in entities: selection += entity.name + '<br/>' if field.data and entity.id in field.data else '' data = get_base_table_data(entity) data[0] = truncate_string(entity.name) # replace entity link with entity name html = """<input type="checkbox" id="{id}" {checked} value="{name}" class="multi-table-select">""".format( id=str(entity.id), name=entity.name, checked='checked = "checked"' if field.data and entity.id in field.data else '') data.append(html) table['data'].append(data) html = """ <span id="{name}-button" class="button">{change_label}</span><br /> <div id="{name}-selection" class="selection" style="text-align:left;">{selection}</div> <div id="{name}-overlay" class="overlay"> <div id="{name}-dialog" class="overlay-container">{pager}</div></div> <script> $(document).ready(function () {{createOverlay("{name}", "{title}", true);}}); </script>""".format( name=field.id, change_label=uc_first(_('change')), title=_(field.id.replace('_', ' ')), selection=selection, pager=pager(table)) return super(TableMultiSelect, self).__call__(field, **kwargs) + html
def build_search_table(form): table = {'id': 'search', 'data': [], 'header': ['name', 'class', 'first', 'last', 'description']} codes = [] for name in form.classes.data: codes += app.config['CLASS_CODES'][name] if name == 'actor': codes.append('E82') if name == 'place': codes.append('E41') for entity in EntityMapper.search(form.term.data, codes, form.desc.data, form.own.data): table['data'].append([ link(entity), entity.class_.name, entity.first, entity.last, truncate_string(entity.description)]) return table
def source_view(id_): source = EntityMapper.get_by_id(id_) tables = { 'info': get_entity_data(source), 'text': {'id': 'translation', 'data': [], 'header': ['text', 'type', 'content']}, 'file': {'id': 'files', 'data': [], 'header': app.config['TABLE_HEADERS']['file'] + [_('main image')]}, 'reference': {'id': 'source', 'data': [], 'header': app.config['TABLE_HEADERS']['reference'] + ['page']}} for text in source.get_linked_entities('P73'): tables['text']['data'].append([ link(text), next(iter(text.nodes)).name if text.nodes else '', truncate_string(text.description)]) for name in ['actor', 'event', 'place', 'feature', 'stratigraphic-unit', 'find']: tables[name] = {'id': name, 'header': app.config['TABLE_HEADERS'][name], 'data': []} for link_ in source.get_links('P67'): range_ = link_.range data = get_base_table_data(range_) if is_authorized('editor'): url = url_for('link_delete', id_=link_.id, origin_id=source.id) data.append(display_remove_link(url + '#tab-' + range_.table_name, range_.name)) tables[range_.table_name]['data'].append(data) profile_image_id = source.get_profile_image_id() for link_ in source.get_links(['P67', 'P128'], True): domain = link_.domain data = get_base_table_data(domain) if domain.view_name == 'file': # pragma: no cover extension = data[3].replace('.', '') data.append(get_profile_image_table_link(domain, source, extension, profile_image_id)) if not profile_image_id and extension in app.config['DISPLAY_FILE_EXTENSIONS']: profile_image_id = domain.id if domain.view_name not in ['file']: data.append(link_.description) if is_authorized('editor'): update_url = url_for('reference_link_update', link_id=link_.id, origin_id=source.id) data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') if is_authorized('editor'): url = url_for('link_delete', id_=link_.id, origin_id=source.id) data.append(display_remove_link(url + '#tab-' + domain.view_name, domain.name)) tables[domain.view_name]['data'].append(data) return render_template('source/view.html', source=source, tables=tables, profile_image_id=profile_image_id)
def build_search_table(form): table = { 'id': 'search', 'header': ['name', 'class', 'first', 'last', 'description'], 'data': [] } codes = [] for name in form.classes.data: codes += app.config['CLASS_CODES'][name] if name == 'actor': codes.append('E82') if name == 'place': codes.append('E41') for entity in EntityMapper.search(form.term.data, codes, form.desc.data, form.own.data): table['data'].append([ link(entity), entity.class_.name, entity.first, entity.last, truncate_string(entity.description) ]) return table
def source_view(id_, unlink_id=None): source = EntityMapper.get_by_id(id_) if unlink_id: LinkMapper.delete_by_id(unlink_id) flash(_('link removed'), 'info') tables = { 'info': get_entity_data(source), 'text': {'id': 'translation', 'data': [], 'header': ['text', 'type', 'content']}, 'file': {'id': 'files', 'data': [], 'header': app.config['TABLE_HEADERS']['file']}, 'reference': { 'id': 'source', 'data': [], 'header': app.config['TABLE_HEADERS']['reference'] + ['page']}} for text in source.get_linked_entities('P73'): tables['text']['data'].append([ link(text), next(iter(text.nodes)).name if text.nodes else '', truncate_string(text.description)]) for name in ['actor', 'event', 'place', 'feature', 'stratigraphic-unit', 'find']: tables[name] = {'id': name, 'header': app.config['TABLE_HEADERS'][name], 'data': []} for link_ in source.get_links('P67'): data = get_base_table_data(link_.range) view_name = get_view_name(link_.range) view_name = view_name if view_name != 'place' else link_.range.system_type.replace(' ', '-') if is_authorized('editor'): unlink = url_for('source_view', id_=source.id, unlink_id=link_.id) + '#tab-' + view_name data.append(display_remove_link(unlink, link_.range.name)) tables[view_name]['data'].append(data) for link_ in source.get_links(['P67', 'P128'], True): data = get_base_table_data(link_.domain) view_name = get_view_name(link_.domain) if view_name not in ['file']: data.append(link_.description) if is_authorized('editor'): update_url = url_for('reference_link_update', link_id=link_.id, origin_id=source.id) data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') if is_authorized('editor'): unlink = url_for('source_view', id_=source.id, unlink_id=link_.id) + '#tab-' + view_name data.append(display_remove_link(unlink, link_.domain.name)) tables[view_name]['data'].append(data) return render_template('source/view.html', source=source, tables=tables)
def __call__(self, field, **kwargs): if field.data and type(field.data) is str: field.data = ast.literal_eval(field.data) selection = '' class_ = field.id if field.id != 'given_place' else 'place' table = {'id': field.id, 'header': app.config['TABLE_HEADERS'][class_], 'data': []} # Make checkbox column sortable and show selected on top table['headers'] = 'headers: { ' + str(len(table['header'])) + ': { sorter: "checkbox" } }' table['sort'] = 'sortList: [[' + str(len(table['header'])) + ',0],[0,0]]' if class_ == 'place': entities = EntityMapper.get_by_system_type('place') else: entities = EntityMapper.get_by_codes(class_) for entity in entities: selection += entity.name + '<br/>' if field.data and entity.id in field.data else '' data = get_base_table_data(entity) data[0] = truncate_string(entity.name) # Replace entity link with entity name html = """<input type="checkbox" id="{id}" {checked} value="{name}" class="multi-table-select">""".format( id=str(entity.id), name=entity.name, checked='checked = "checked"' if field.data and entity.id in field.data else '') data.append(html) table['data'].append(data) html = """ <span id="{name}-button" class="button">{change_label}</span><br /> <div id="{name}-selection" class="selection" style="text-align:left;">{selection}</div> <div id="{name}-overlay" class="overlay"> <div id="{name}-dialog" class="overlay-container">{pager}</div></div> <script> $(document).ready(function () {{createOverlay("{name}", "{title}", true);}}); </script>""".format( name=field.id, change_label=uc_first(_('change')), title=_(field.id.replace('_', ' ')), selection=selection, pager=pager(table, remove_rows=False)) return super(TableMultiSelect, self).__call__(field, **kwargs) + html
def actor_view(id_): actor = EntityMapper.get_by_id(id_) actor.set_dates() objects = [] info = get_entity_data(actor) residence = actor.get_linked_entity('P74') if residence: object_ = residence.get_linked_entity('P53', True) objects.append(object_) info.append((uc_first(_('residence')), link(object_))) first = actor.get_linked_entity('OA8') if first: object_ = first.get_linked_entity('P53', True) objects.append(object_) info.append((uc_first(_('appears first')), link(object_))) last = actor.get_linked_entity('OA9') if last: object_ = last.get_linked_entity('P53', True) objects.append(object_) info.append((uc_first(_('appears last')), link(object_))) tables = { 'info': info, 'file': {'id': 'files', 'data': [], 'header': app.config['TABLE_HEADERS']['file'] + [_('main image')]}, 'source': {'id': 'source', 'data': [], 'header': app.config['TABLE_HEADERS']['source']}, 'reference': {'id': 'reference', 'data': [], 'header': app.config['TABLE_HEADERS']['reference'] + ['pages']}, 'event': {'id': 'event', 'data': [], 'header': ['event', 'class', 'involvement', 'first', 'last', 'description']}, 'relation': {'id': 'relation', 'data': [], 'sort': 'sortList:[[0,0]]', 'header': ['relation', 'actor', 'first', 'last', 'description']}, 'member_of': {'id': 'member_of', 'data': [], 'header': ['member of', 'function', 'first', 'last', 'description']}} profile_image_id = actor.get_profile_image_id() for link_ in actor.get_links('P67', True): domain = link_.domain data = get_base_table_data(domain) if domain.view_name == 'file': extension = data[3].replace('.', '') data.append(get_profile_image_table_link(domain, actor, extension, profile_image_id)) if not profile_image_id and extension in app.config['DISPLAY_FILE_EXTENSIONS']: profile_image_id = domain.id if domain.view_name not in ['source', 'file']: data.append(truncate_string(link_.description)) if is_authorized('editor'): update_url = url_for('reference_link_update', link_id=link_.id, origin_id=actor.id) data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') if is_authorized('editor'): url = url_for('link_delete', id_=link_.id, origin_id=actor.id) data.append(display_remove_link(url + '#tab-' + domain.view_name, domain.name)) tables[domain.view_name]['data'].append(data) # Todo: Performance - getting every place of every object for every event is very costly for link_ in actor.get_links(['P11', 'P14', 'P22', 'P23'], True): event = link_.domain first = link_.first place = event.get_linked_entity('P7') if place: objects.append(place.get_linked_entity('P53', True)) if not link_.first and event.first: first = '<span class="inactive" style="float:right">' + str(event.first) + '</span>' last = link_.last if not link_.last and event.last: last = '<span class="inactive" style="float:right">' + str(event.last) + '</span>' data = ([link(event), g.classes[event.class_.code].name, link_.type.name if link_.type else '', first, last, truncate_string(link_.description)]) if is_authorized('editor'): update_url = url_for('involvement_update', id_=link_.id, origin_id=actor.id) unlink_url = url_for('link_delete', id_=link_.id, origin_id=actor.id) + '#tab-event' data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') data.append(display_remove_link(unlink_url, link_.domain.name)) tables['event']['data'].append(data) for link_ in actor.get_links('OA7') + actor.get_links('OA7', True): if actor.id == link_.domain.id: type_ = link_.type.get_name_directed() if link_.type else '' related = link_.range else: type_ = link_.type.get_name_directed(True) if link_.type else '' related = link_.domain data = ([type_, link(related), link_.first, link_.last, truncate_string(link_.description)]) if is_authorized('editor'): update_url = url_for('relation_update', id_=link_.id, origin_id=actor.id) unlink_url = url_for('link_delete', id_=link_.id, origin_id=actor.id) + '#tab-relation' data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') data.append(display_remove_link(unlink_url, related.name)) tables['relation']['data'].append(data) for link_ in actor.get_links('P107', True): data = ([link(link_.domain), link_.type.name if link_.type else '', link_.first, link_.last, truncate_string(link_.description)]) if is_authorized('editor'): update_url = url_for('member_update', id_=link_.id, origin_id=actor.id) unlink_url = url_for('link_delete', id_=link_.id, origin_id=actor.id) + '#tab-member-of' data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') data.append(display_remove_link(unlink_url, link_.domain.name)) tables['member_of']['data'].append(data) if actor.class_.code in app.config['CLASS_CODES']['group']: tables['member'] = {'id': 'member', 'data': [], 'header': ['member', 'function', 'first', 'last', 'description']} for link_ in actor.get_links('P107'): data = ([link(link_.range), link_.type.name if link_.type else '', link_.first, link_.last, truncate_string(link_.description)]) if is_authorized('editor'): update_url = url_for('member_update', id_=link_.id, origin_id=actor.id) unlink_url = url_for('link_delete', id_=link_.id, origin_id=actor.id) + '#tab-member' data.append('<a href="' + update_url + '">' + uc_first(_('edit')) + '</a>') data.append(display_remove_link(unlink_url, link_.range.name)) tables['member']['data'].append(data) gis_data = GisMapper.get_all(objects) if objects else None if gis_data and gis_data['gisPointSelected'] == '[]': gis_data = None return render_template('actor/view.html', actor=actor, tables=tables, gis_data=gis_data, profile_image_id=profile_image_id)
def truncate_string(self, string): return util.truncate_string(string)
def place_view(id_: int) -> str: object_ = EntityMapper.get_by_id(id_, nodes=True, aliases=True) object_.note = UserMapper.get_note(object_) location = object_.get_linked_entity('P53', nodes=True) tables = { 'info': get_entity_data(object_, location), 'file': Table(Table.HEADERS['file'] + [_('main image')]), 'source': Table(Table.HEADERS['source']), 'event': Table(Table.HEADERS['event'], defs='[{className: "dt-body-right", targets: [3,4]}]'), 'reference': Table(Table.HEADERS['reference'] + ['page / link text']), 'actor': Table([_('actor'), _('property'), _('class'), _('first'), _('last')]) } if object_.system_type == 'place': tables['feature'] = Table(Table.HEADERS['place'] + [_('description')]) if object_.system_type == 'feature': tables['stratigraphic-unit'] = Table(Table.HEADERS['place'] + [_('description')]) if object_.system_type == 'stratigraphic unit': tables['find'] = Table(Table.HEADERS['place'] + [_('description')]) profile_image_id = object_.get_profile_image_id() overlays = None if current_user.settings['module_map_overlay']: overlays = OverlayMapper.get_by_object(object_) if is_authorized('editor'): tables['file'].header.append(uc_first(_('overlay'))) for link_ in object_.get_links('P67', inverse=True): domain = link_.domain data = get_base_table_data(domain) if domain.view_name == 'file': extension = data[3].replace('.', '') data.append( get_profile_image_table_link(domain, object_, extension, profile_image_id)) if not profile_image_id and extension in app.config[ 'DISPLAY_FILE_EXTENSIONS']: profile_image_id = domain.id if is_authorized( 'editor') and current_user.settings['module_map_overlay']: if extension in app.config['DISPLAY_FILE_EXTENSIONS']: if domain.id in overlays: url = url_for('overlay_update', id_=overlays[domain.id].id) data.append('<a href="' + url + '">' + uc_first(_('edit')) + '</a>') else: url = url_for('overlay_insert', image_id=domain.id, place_id=object_.id, link_id=link_.id) data.append('<a href="' + url + '">' + uc_first(_('add')) + '</a>') else: # pragma: no cover data.append('') if domain.view_name not in ['source', 'file']: data.append(truncate_string(link_.description)) if domain.system_type.startswith('external reference'): object_.external_references.append(link_) if is_authorized( 'contributor' ) and domain.system_type != 'external reference geonames': url = url_for('reference_link_update', link_id=link_.id, origin_id=object_.id) data.append('<a href="' + url + '">' + uc_first(_('edit')) + '</a>') else: data.append('') if is_authorized('contributor'): url = url_for('link_delete', id_=link_.id, origin_id=object_.id) data.append( display_remove_link(url + '#tab-' + domain.view_name, domain.name)) tables[domain.view_name].rows.append(data) event_ids = [] # Keep track of already inserted events to prevent doubles for event in location.get_linked_entities(['P7', 'P26', 'P27'], inverse=True): tables['event'].rows.append(get_base_table_data(event)) event_ids.append(event.id) for event in object_.get_linked_entities(['P24'], inverse=True): if event.id not in event_ids: # Don't add again if already in table tables['event'].rows.append(get_base_table_data(event)) has_subunits = False for entity in object_.get_linked_entities('P46', nodes=True): has_subunits = True data = get_base_table_data(entity) data.append(truncate_string(entity.description)) tables[entity.system_type.replace(' ', '-')].rows.append(data) for link_ in location.get_links(['P74', 'OA8', 'OA9'], inverse=True): actor = EntityMapper.get_by_id(link_.domain.id) tables['actor'].rows.append([ link(actor), g.properties[link_.property.code].name, actor.class_.name, actor.first, actor.last ]) gis_data = GisMapper.get_all(object_) if location else None if gis_data['gisPointSelected'] == '[]' and gis_data['gisPolygonSelected'] == '[]' \ and gis_data['gisLineSelected'] == '[]': gis_data = None place = None feature = None stratigraphic_unit = None if object_.system_type == 'find': stratigraphic_unit = object_.get_linked_entity('P46', True) feature = stratigraphic_unit.get_linked_entity('P46', True) place = feature.get_linked_entity('P46', True) elif object_.system_type == 'stratigraphic unit': feature = object_.get_linked_entity('P46', True) place = feature.get_linked_entity('P46', True) elif object_.system_type == 'feature': place = object_.get_linked_entity('P46', True) return render_template('place/view.html', object_=object_, tables=tables, gis_data=gis_data, place=place, feature=feature, stratigraphic_unit=stratigraphic_unit, has_subunits=has_subunits, profile_image_id=profile_image_id, overlays=overlays)
def place_view(id_, unlink_id=None): object_ = EntityMapper.get_by_id(id_) if unlink_id: LinkMapper.delete_by_id(unlink_id) flash(_('link removed'), 'info') object_.set_dates() location = object_.get_linked_entity('P53') tables = { 'info': get_entity_data(object_, location), 'file': {'id': 'files', 'data': [], 'header': app.config['TABLE_HEADERS']['file']}, 'source': {'id': 'source', 'data': [], 'header': app.config['TABLE_HEADERS']['source']}, 'event': {'id': 'event', 'data': [], 'header': app.config['TABLE_HEADERS']['event']}, 'reference': { 'id': 'reference', 'data': [], 'header': app.config['TABLE_HEADERS']['reference'] + ['pages']}, 'actor': { 'id': 'actor', 'data': [], 'header': [_('actor'), _('property'), _('class'), _('first'), _('last')]}} if object_.system_type == 'place': tables['feature'] = {'id': 'feature', 'data': [], 'header': app.config['TABLE_HEADERS']['place'] + [_('description')]} if object_.system_type == 'feature': tables['stratigraphic-unit'] = { 'id': 'stratigraphic', 'data': [], 'header': app.config['TABLE_HEADERS']['place'] + [_('description')]} if object_.system_type == 'stratigraphic unit': tables['find'] = {'id': 'find', 'data': [], 'header': app.config['TABLE_HEADERS']['place'] + [_('description')]} for link_ in object_.get_links('P67', True): data = get_base_table_data(link_.domain) view_name = get_view_name(link_.domain) if view_name not in ['source', 'file']: data.append(truncate_string(link_.description)) if is_authorized('editor'): url = url_for('reference_link_update', link_id=link_.id, origin_id=object_.id) data.append('<a href="' + url + '">' + uc_first(_('edit')) + '</a>') if is_authorized('editor'): url = url_for('place_view', id_=object_.id, unlink_id=link_.id) + '#tab-' + view_name data.append(display_remove_link(url, link_.domain.name)) tables[view_name]['data'].append(data) for event in location.get_linked_entities(['P7', 'P24'], True): tables['event']['data'].append(get_base_table_data(event)) has_subunits = False for entity in object_.get_linked_entities('P46'): has_subunits = True data = get_base_table_data(entity) data.append(truncate_string(entity.description)) tables[entity.system_type.replace(' ', '-')]['data'].append(data) for link_ in location.get_links(['P74', 'OA8', 'OA9'], True): actor = EntityMapper.get_by_id(link_.domain.id) tables['actor']['data'].append([ link(actor), g.properties[link_.property.code].name, actor.class_.name, actor.first, actor.last]) gis_data = GisMapper.get_all(object_.id) if location else None if gis_data['gisPointSelected'] == '[]' and gis_data['gisPolygonSelected'] == '[]': gis_data = None place = None feature = None stratigraphic_unit = None if object_.system_type == 'find': stratigraphic_unit = object_.get_linked_entity('P46', True) feature = stratigraphic_unit.get_linked_entity('P46', True) place = feature.get_linked_entity('P46', True) elif object_.system_type == 'stratigraphic unit': feature = object_.get_linked_entity('P46', True) place = feature.get_linked_entity('P46', True) elif object_.system_type == 'feature': place = object_.get_linked_entity('P46', True) return render_template('place/view.html', object_=object_, tables=tables, gis_data=gis_data, place=place, feature=feature, stratigraphic_unit=stratigraphic_unit, has_subunits=has_subunits)
def __call__(self, field, **kwargs): file_stats = None place_fields = [ 'residence', 'begins_in', 'ends_in', 'place_to', 'place_from' ] class_ = 'place' if field.id in place_fields else field.id if class_ == 'place': aliases = current_user.settings['table_show_aliases'] entities = EntityMapper.get_by_system_type('place', nodes=True, aliases=aliases) elif class_ == 'reference': entities = EntityMapper.get_by_system_type('bibliography') + \ EntityMapper.get_by_system_type('edition') + \ EntityMapper.get_by_system_type('external reference') elif class_ == 'file': entities = EntityMapper.get_display_files() file_stats = get_file_stats() else: entities = EntityMapper.get_by_codes(class_) selection = '' table = Table(Table.HEADERS[class_]) # Table definitions (aligning) if class_ == 'event': table.defs += '[{className: "dt-body-right", targets: [3,4]}]' elif class_ in ['actor', 'group', 'feature', 'place']: table.defs += '[{className: "dt-body-right", targets: [2,3]}]' for entity in entities: # Todo: don't show self e.g. at source if field.data and entity.id == int(field.data): selection = entity.name data = get_base_table_data(entity, file_stats) data[ 0] = """<a onclick="selectFromTable(this,'{name}', {entity_id})">{entity_name}</a> """.format(name=field.id, entity_id=entity.id, entity_name=truncate_string(entity.name, span=False)) data[0] = '<br />'.join([data[0]] + [ truncate_string(alias) for id_, alias in entity.aliases.items() ]) table.rows.append(data) html = """ <input id="{name}-button" name="{name}-button" class="table-select {required}" type="text" placeholder="{change_label}" onfocus="this.blur()" readonly="readonly" value="{selection}"> <a id="{name}-clear" class="button" {clear_style} onclick="clearSelect('{name}');">{clear_label}</a> <div id="{name}-overlay" class="overlay"> <div id="{name}-dialog" class="overlay-container">{table}</div></div> <script>$(document).ready(function () {{createOverlay("{name}", "{title}");}});</script> """.format( name=field.id, title=_(field.id.replace('_', ' ')), change_label=uc_first(_('change')), clear_label=uc_first(_('clear')), table=table.display(field.id), selection=selection, clear_style='' if selection else ' style="display: none;" ', required=' required' if field.flags.required else '') return super(TableSelect, self).__call__(field, **kwargs) + html
def truncate_string(self, string: str) -> str: return util.truncate_string(string)