def get_others(rels, node): ''' other items of the node's type related to something it is related to. For example: "Other editions by the editor Joseph H. Peterson" :param rels: default relationship list :param node: the item node :return: customized data for this label ''' label = node['label'] others = [] for rel in rels: start = rel['start'] end = rel['end'] # must be different types of data, and not entities in a grimoire if start['label'] != end['label'] and \ (end['label'] != 'demon' and start['label'] != 'grimoire'): # other = "editions" other = start if start['label'] != label else end other_items = graph.others_of_type(label, other['props']['uid'], node['props']['uid']) if other_items['nodes']: others.append({ 'title': 'Other %s related to the %s %s' % (helpers.pluralize(label), helpers.format_filter(other['label']), other['props']['identifier']), 'data': other_items['nodes'] }) return others
def get_others(rels, node): ''' other items of the node's type related to something it is related to. For example: "Other editions by the editor Joseph H. Peterson" :param rels: default relationship list :param node: the item node :return: customized data for this label ''' label = node['label'] others = [] for rel in rels: start = rel['start'] end = rel['end'] # must be different types of data, and not entities in a grimoire if start['label'] != end['label'] and \ (end['label'] != 'demon' and start['label'] != 'grimoire'): # other = "editions" other = start if start['label'] != label else end other_items = graph.others_of_type(label, other['props']['uid'], node['props']['uid']) if other_items['nodes']: others.append({ 'title': 'Other %s related to the %s %s' % (helpers.pluralize(label), helpers.format_filter( other['label']), other['props']['identifier']), 'data': other_items['nodes'] }) return others
def grimoire_item(node, rels): ''' grimoire item page :param node: the item node :param rels: default relationship list :return: customized data for this label ''' data = generic_item(node, rels) data['rels'] = helpers.exclude_rels(data['rels'], [ 'lists', 'has', 'includes', 'wrote', 'was_written_in']) data['details']['date'] = [{'text': helpers.grimoire_date(node['props'])}] authors = extract_rel_list_by_type(rels, 'wrote', 'start') authors = extract_details(authors) if authors: data['details']['author'] = authors languages = extract_rel_list_by_type(rels, 'was_written_in', 'end') if languages: data['details']['language'] = extract_details(languages) editions = extract_rel_list(rels, 'edition', 'end') if editions: data['sidebar'].append({ 'title': 'Editions', 'data': editions }) for entity in entities: items = extract_rel_list_by_type(rels, 'lists', 'end', label=entity) if len(items): item_json = { 'title': helpers.pluralize(entity), 'data': items, 'many': True, 'compare': get_comparison(node, entity) } data['main'].append(item_json) spells = extract_rel_list(rels, 'spell', 'end') if len(spells): data['main'].append({ 'title': 'Spells', 'data': spells, 'many': False, 'compare': get_comparison(node, 'spell') }) talisman = extract_rel_list(rels, 'talisman', 'end') if len(talisman): data['main'].append({ 'title': 'Talismans', 'data': talisman, 'many': False }) return data
def category(label): ''' list of entries for a label :param label: the type of data to list out :return: rendered list page ''' label = helpers.sanitize(label) if not graph.validate_label(label): labels = graph.get_labels() return render_template(request.url, '404.html', labels=labels) filtered = None try: item1 = helpers.sanitize(request.values['i']) except KeyError: data = graph.get_all(label) else: try: item2 = helpers.sanitize(request.values['j']) operator = helpers.sanitize(request.values['op']) if operator not in ['and', 'not']: raise BadRequestKeyError except (KeyError, BadRequestKeyError): data = graph.get_filtered(label, item1) filtered = { 'item1': graph.get_node(item1)['nodes'][0], } else: data = graph.get_filtered(label, item1, item2, operator) filtered = { 'operator': operator, 'item1': graph.get_node(item1)['nodes'][0], 'item2': graph.get_node(item2)['nodes'][0] } items = data['nodes'] template = 'list.html' title = 'List of %s' % helpers.capitalize_filter(helpers.pluralize(label)) grimoires = [] if label in entities: template = 'entity-list.html' grimoires = graph.get_all('grimoire', with_connection_label=label)['nodes'] if len(grimoires) < 2: grimoires = None return render_template(request.url, template, items=items, title=title, label=label, grimoires=grimoires, filtered=filtered)
def grimoire_item(node, rels): ''' grimoire item page :param node: the item node :param rels: default relationship list :return: customized data for this label ''' data = generic_item(node, rels) data['rels'] = helpers.exclude_rels( data['rels'], ['lists', 'has', 'includes', 'wrote', 'was_written_in']) data['details']['date'] = [{'text': helpers.grimoire_date(node['props'])}] authors = extract_rel_list_by_type(rels, 'wrote', 'start') authors = extract_details(authors) if authors: data['details']['author'] = authors languages = extract_rel_list_by_type(rels, 'was_written_in', 'end') if languages: data['details']['language'] = extract_details(languages) editions = extract_rel_list(rels, 'edition', 'end') if editions: data['sidebar'].append({'title': 'Editions', 'data': editions}) for entity in entities: items = extract_rel_list_by_type(rels, 'lists', 'end', label=entity) if len(items): item_json = { 'title': helpers.pluralize(entity), 'data': items, 'many': True, 'compare': get_comparison(node, entity) } data['main'].append(item_json) spells = extract_rel_list(rels, 'spell', 'end') if len(spells): data['main'].append({ 'title': 'Spells', 'data': spells, 'many': False, 'compare': get_comparison(node, 'spell') }) talisman = extract_rel_list(rels, 'talisman', 'end') if len(talisman): data['main'].append({ 'title': 'Talismans', 'data': talisman, 'many': False }) return data
def category(label): ''' list of entries for a label :param label: the type of data to list out :return: rendered list page ''' label = helpers.sanitize(label) if not graph.validate_label(label): labels = graph.get_labels() return render_template(request.url, 'label-404.html', labels=labels) filtered = None try: item1 = helpers.sanitize(request.values['i']) except KeyError: data = graph.get_all(label) else: try: item2 = helpers.sanitize(request.values['j']) operator = helpers.sanitize(request.values['op']) if operator not in ['and', 'not']: raise BadRequestKeyError except (KeyError, BadRequestKeyError): data = graph.get_filtered(label, item1) filtered = { 'item1': graph.get_node(item1)['nodes'][0], } else: data = graph.get_filtered(label, item1, item2, operator) filtered = { 'operator': operator, 'item1': graph.get_node(item1)['nodes'][0], 'item2': graph.get_node(item2)['nodes'][0] } items = data['nodes'] template = 'list.html' title = 'List of %s' % helpers.capitalize_filter(helpers.pluralize(label)) grimoires = [] if label in entities: template = 'entity-list.html' grimoires = graph.get_all('grimoire', with_connection_label=label)['nodes'] if len(grimoires) < 2: grimoires = None return render_template(request.url, template, items=items, title=title, label=label, grimoires=grimoires, filtered=filtered)
def art_item(node, rels): ''' art/topic item page :param node: the item node :param rels: default relationship list :return: customized data for this label ''' data = generic_item(node, rels) data['entities'] = {} for entity in entities: items = extract_rel_list(rels, entity, 'start') if len(items): data['main'].append({ 'title': helpers.pluralize(entity), 'data': items, 'many': True }) data['rels'] = helpers.exclude_rels(data['rels'], ['teaches', 'skilled_in']) return data
def outcome_item(node, rels): ''' spell item page :param node: the item node :param rels: default relationship list :return: customized data for this label ''' data = generic_item(node, rels) spells = extract_rel_list(rels, 'spell', 'start') if spells: data['main'].append({'title': 'Spells', 'data': spells}) for entity in entities: items = extract_rel_list(rels, entity, 'start') if items: data['main'].append({'title': helpers.pluralize(entity), 'data': items}) data['rels'] = helpers.exclude_rels(data['rels'], ['for']) return data
def format_list(nodes, italics=True, show_label=True): ''' add "and" and commas to a list ''' items = [helpers.unthe(n['props']['identifier']) for n in nodes] if not items: return '' if len(items) == 2: if italics: result = '_%s_ and _%s_' % (items[0], items[1]) else: result = '%s and %s' % (items[0], items[1]) elif len(items) > 1: if italics: result = '_%s_, and _%s_' % ('_, _'.join(items[0:-1]), items[-1]) else: result = '%s, and %s' % (', '.join(items[0:-1]), items[-1]) else: result = '_%s_' % items[0] if italics else '%s' % items[0] label = helpers.pluralize(nodes[0]['label']) \ if len(items) > 1 else nodes[0]['label'] return 'the %s %s' % (label, result) if show_label else result
def outcome_item(node, rels): ''' spell item page :param node: the item node :param rels: default relationship list :return: customized data for this label ''' data = generic_item(node, rels) spells = extract_rel_list(rels, 'spell', 'start') if spells: data['main'].append({'title': 'Spells', 'data': spells}) for entity in entities: items = extract_rel_list(rels, entity, 'start') if items: data['main'].append({ 'title': helpers.pluralize(entity), 'data': items }) data['rels'] = helpers.exclude_rels(data['rels'], ['for']) return data
def item(label, uid): ''' generic page for an item :param label: the desired neo4j label :param uid: the human-readable uid of the node :return: customized data for this label rendered item page template ''' # load and validate url data label = helpers.sanitize(label) if not graph.validate_label(label): logging.error('Invalid label %s', label) return render_template(request.url, 'label-404.html', labels=graph.get_labels()) try: data = helpers.get_node(uid) except NameError: items = graph.get_all(label) return render_template(request.url, 'item-404.html', items=items['nodes'], search=graph.search(uid)['nodes'], label=label) node = data['node'] rels = data['rels'] # ----- page header/metadata title = node['props']['identifier'] # ----- formatted data switch = { 'parent:book': grimoire_item, 'parent:entity': entity_item, 'art': art_item, 'language': language_item, 'edition': edition_item, 'publisher': publisher_item, 'editor': editor_item, 'default': generic_item, 'spell': spell_item, 'talisman': spell_item, 'parent:ingredient': ingredient_item, 'outcome': outcome_item } key = node['parent_label'] if node['parent_label'] in switch else \ (label if label in switch else 'default') item_data = switch[key](node, rels) item_data['rels'] = helpers.combine_rels(item_data['rels']) # ----- sidebar sidebar = [] related = graph.related(uid, label) if related['nodes']: sidebar = [{'title': 'Similar %s' % \ helpers.capitalize_filter(helpers.pluralize(label)), 'data': related['nodes']}] sidebar += get_others(data['rels'], node) if not item_data['content'] and not item_data['excerpts']: item_data['content'] = 'The %s "%s."' % \ (helpers.format_filter(label), helpers.unthe(title)) max_main_length = max([len(i['data']) for i in item_data['main']] + [0]) default_collapse = len(item_data['main']) > 2 or max_main_length > 30 return render_template(request.url, 'item.html', data=item_data, title=title, label=label, sidebar=sidebar, default_collapse=default_collapse)
def item(label, uid): ''' generic page for an item :param label: the desired neo4j label :param uid: the human-readable uid of the node :return: customized data for this label rendered item page template ''' # load and validate url data label = helpers.sanitize(label) if not graph.validate_label(label): logging.error('Invalid label %s', label) return render_template(request.url, '404.html', labels=graph.get_labels()) try: data = helpers.get_node(uid) except NameError: items = graph.get_all(label) return render_template(request.url, '404.html', items=items['nodes'], search=graph.search(uid)['nodes'], label=label) node = data['node'] rels = data['rels'] # ----- page header/metadata title = node['props']['identifier'] # ----- formatted data switch = { 'parent:book': grimoire_item, 'parent:entity': entity_item, 'art': art_item, 'language': language_item, 'edition': edition_item, 'publisher': publisher_item, 'editor': editor_item, 'default': generic_item, 'spell': spell_item, 'talisman': spell_item, 'parent:ingredient': ingredient_item, 'outcome': outcome_item } key = node['parent_label'] if node['parent_label'] in switch else \ (label if label in switch else 'default') item_data = switch[key](node, rels) item_data['rels'] = helpers.combine_rels(item_data['rels']) # ----- sidebar sidebar = [] related = graph.related(uid, label) if related['nodes']: sidebar = [{'title': 'Similar %s' % \ helpers.capitalize_filter(helpers.pluralize(label)), 'data': related['nodes']}] sidebar += get_others(data['rels'], node) if not item_data['content'] and not item_data['excerpts']: item_data['content'] = 'The %s "%s."' % \ (helpers.format_filter(label), helpers.unthe(title)) max_main_length = max([len(i['data']) for i in item_data['main']] + [0]) default_collapse = len(item_data['main']) > 2 or max_main_length > 30 return render_template(request.url, 'item.html', data=item_data, title=title, label=label, sidebar=sidebar, default_collapse=default_collapse)