From a7c813ce12ad81b8ba500d0ecd63083c18d1cf1a Mon Sep 17 00:00:00 2001 From: "David, Sebastian" <sebastian.david@uni-hamburg.de> Date: Mon, 6 Dec 2021 09:31:42 +0000 Subject: [PATCH] Delete citation_parser_ui.py --- citation_parser_ui.py | 249 ------------------------------------------ 1 file changed, 249 deletions(-) delete mode 100644 citation_parser_ui.py diff --git a/citation_parser_ui.py b/citation_parser_ui.py deleted file mode 100644 index fd7ee84..0000000 --- a/citation_parser_ui.py +++ /dev/null @@ -1,249 +0,0 @@ -import base64 -import re -import dash -from dash import dcc -from dash import html -from dash import callback_context -from dash.dependencies import Input, Output, State -from dash.exceptions import PreventUpdate -from input.interface import InputInterface -import input.publication - -app = dash.Dash(__name__) - -# List of options when inputting data and generating the graph -additional_options = ['Update Automatically','Smart Input'] - -# Reads the contents of info_box.txt. They can later be displayed by pressing the corresponding button. -f = open('info_box.txt', 'r') -boxcontent = f.read() -f.close() - -app.layout = html.Div([ - # Layer 0: For the Header and Help Function(s) - html.Div([ - html.Button(id='show-info',children='Show Info',n_clicks=0), - html.Div(id='info-box') - ]), - # Layer 1: For all mandatory Inputs - html.Div([ - "Input: ", - # A simple box for inputting a string. Value is transmitted upon pressen return or clicking out of the box. - dcc.Input(id='input-string', value='', type='text',debounce=True), - # Forward recursion. Values between 1 and 10 can be entered. - dcc.Input(id='forward-depth',value='1',type='number',min='1',max='10'), - # Backward recursion. Values between 1 and 10 can be entered. - dcc.Input(id='backward-depth',value='1',type='number',min='1',max='10'), - # Upload box. Can be used via drag-and-drop or byclicking on it to open a file viewer. - dcc.Upload( - id="upload-data", - children=html.Div( - ["Drag and drop or click to select a file to upload."]), - style={ - "width": "30%", - "height": "60px", - "lineHeight": "60px", - "borderWidth": "1px", - "borderStyle": "dashed", - "borderRadius": "5px", - "textAlign": "center", - "margin": "10px", - }) - ]), - # Layer 2: For the checklist, Remove-/Start-Buttons and input-error-message - html.Div([ - # All input DOIs are collected in this checklist. It is initialized to avoid error messages. - dcc.Checklist(id='input-checklist',options=[],labelStyle = dict(display='block'),value=[]), - # Displays error message if 'Smart Input' is active. - html.Div(id='input-err',style={'color':'red'}), - # Clears the entire list. - html.Button(id='clear-all-button',children='Clear All'), - # Clear all selected elements. - html.Button(id='clear-selected-button',children='Clear Selected'), - # Starts the process that generates a graph. - html.Button(id='start-button',children='Generate Graph') - ]), - # Layer 3: For additional Options (e.g. Topological Sort) - html.Div([ - html.H4('Additional Options'), - # A checklist of all additional options that are listed above. - dcc.Checklist(id='additional-options', - options=[{'label':k,'value':k} for k in additional_options], - value=[]) - ]), - # Layer 4: For the Graph - html.Div([ - html.Div(id='test-output') - ]) -]) - -@app.callback( - Output('input-checklist','options'), - Output('input-checklist','value'), - Output('input-string','value'), - Output('input-err','children'), - Input('input-string','value'), - Input('clear-all-button','n_clicks'), - Input('clear-selected-button','n_clicks'), - Input('upload-data','contents'), - State('input-checklist','options'), - State('input-checklist','value'), - State('additional-options','value') -) -def update_input_checklist(input_value,btn1,btn2,filecontents,all_inputs,selected_inputs,additional_options): - ''' - Most important callback function. Updates the checklist that holds all inputs. - State of the checklist as input is needed so that previews entries are readded. - input-string is required as Output to clear the input box after each input. - Different actions are performed depending on which input triggered the callback. - The value-attribute of input-checklist must be updates so that the values - of deleted elements no longer appear in the list of selected elements. - - :param input_value: given by dcc.Input - :type input_value: string - :param btn1: signals pressing of clear-all-button - :type btn1: int - :param btn2: signals pressing of clear-selected-button - :type btn2: int - :param filecontents: the contents of an uploaded file - :type filecontents: bit-string - :param all_inputs: all labels and values from the checklist, - regardless if they have been checked or not - :type all_inputs: list of dictionaries with 2 entries each - :param selected_inputs: values of all checked elements - :type selected_inputs: list of strings - :param addtitional_options: all checked additional options - :type additional_options: list of strings - ''' - # changed_id is used to determine which Input has triggered the callback - changed_id = [p['prop_id'] for p in callback_context.triggered][0] - - # if clear-all-button was pressed: - if 'clear-all-button' in changed_id: - return list(),list(),'','' - - # if clear-selected-button was pressed: - if 'clear-selected-button' in changed_id: - all_inputs = [i for i in all_inputs if i['value'] not in selected_inputs] - return all_inputs,list(),'','' - - # when a new element is added via dcc.Input - if 'input-string' in changed_id: - # Creates a list of previously added inputs to make sure nothing is added twice - currValues = [x['value'] for x in all_inputs] - if input_value not in currValues: - - # if 'Smart Input' is selected, the input will be checked for validity - # and a more readable string will be returned - if 'Smart Input' in additional_options: - try: - # Attempts to call get_publication. If unsuccesful, - # the DOI is not added and an error message is returned - i = InputInterface() - pub = i.get_publication(input_value) - except Exception as err: - return options,selected_inputs,'','{}'.format(err) - # Creates a more readable string to display in the checklist - rep_str = pub.contributors[0] + ',' + pub.journal + ',' + pub.publication_date - all_inputs.append({'label':rep_str, 'value':input_value}) - - # if 'Smart Input' is not selected, the input value is added as is, - # without checking for validity. - else: - all_inputs.append({'label':input_value,'value':input_value}) - return all_inputs,selected_inputs,'','' - - # when a txt-file is uploaded - if 'upload-data.contents' in changed_id: - if filecontents: - # Skips the info portion that is added when a file is uploaded - found = base64.b64decode(re.search(',(.+?)$', filecontents).group(1)) - # Returns the binary string into a proper text - text = found.decode('utf-8') - # Creates a list of inputs by splitting the lines - list_of_inputs = (text.strip().split('\n')) - CurrValues = [x['value'] for x in all_inputs] - # For every line the same actions as for a single input are performed - for input_value in list_of_inputs: - if input_value not in CurrValues: - if 'Smart Input' in additional_options: - try: - i = InputInterface() - pub = i.get_publication(input_value) - except Exception as err: - return all_inputs,selected_inputs,'','{}'.format(err) - rep_str = pub.contributors[0] + ',' + pub.journal + ',' + pub.publication_date - all_inputs.append({'label':rep_str, 'value':input_value}) - else: - all_inputs.append({'label':input_value,'value':input_value}) - return all_inputs,selected_inputs,'','' - # when the programm is first started: - # if this is not done, the input_checklist will be generated - # with one element that contains an empty string - if input_value == '': - app.layout['input-checklist'].options.clear() - return list(),list(),'','' - -@app.callback( - Output('info-box','children'), - Input('show-info','n_clicks') -) -def show_hide_info_box(n_clicks): - ''' - This callback shows and hides the (first) info-box by, checking how often - the button has been pressed. The text was loaded at the top. - :param n_clicks: number of times show-info has been clicked. - 'type n_clicks: int - ''' - if n_clicks % 2 == 0: - return '' - else: - return html.Div(boxcontent, style={'whiteSpace': 'pre-line'}) - -@app.callback( - Output('test-output','children'), - Input('start-button','n_clicks'), - Input('input-checklist','options'), - Input('input-checklist','value'), - Input('forward-depth','value'), - Input('backward-depth','value'), - State('additional-options','value') -) -def generate_output(n_clicks,all_inputs,selected_inputs, - forward_depth,backward_depth,additional_options): - ''' - Basic structure for a callback that generates an output. This is only a - proof of concept and has noting to do with the intended output yet. - - :param n_clicks: how often has Generate Graph been clicked - :type n_clicks: int - :param all_inputs: all labels and values from the checklist, - regardless if they have been checked or not - :type all_inputs: list of dictionaries with 2 entries each - :param selected_inputs: values of all checked elements - :type selected_inputs: list of strings - :param forward_depth: forward recursion depth - :type forward_depth: unsigned int - :param backward_depth: backward recursion depth - :type backward_depth: unsigned int - :param additional_options: value of all selected additional options - :type additional_options: list of strings - ''' - changed_id = [p['prop_id'] for p in callback_context.triggered][0] - if n_clicks is None: - raise PreventUpdate - elif 'Update Automatically' in additional_options \ - or 'start-button' in changed_id: - s = '' - for i in range(len(all_inputs)): - x = all_inputs[i]['value'] - if x in selected_inputs: - s += x*(abs(int(forward_depth)-int(backward_depth))) - else: - s += x*(int(forward_depth)+int(backward_depth)) - return s - else: - raise PreventUpdate - -if __name__ == '__main__': - app.run_server(debug=True) -- GitLab