| </fieldType> | </fieldType> | ||||
| <!-- END --> | <!-- END --> | ||||
| <!-- ADDED BY SIMON BOWIE 2022-08-14 --> | |||||
| <copyField source="content" dest="country"/> | |||||
| <field name="country" type="country" indexed="true" stored="true"/> | |||||
| <fieldType name="country" class="solr.TextField" positionIncrementGap="100"> | |||||
| <analyzer> | |||||
| <tokenizer class="solr.PatternTokenizerFactory" pattern="FT=D[^\s]*\s(\w{2})" group="1" /> | |||||
| </analyzer> | |||||
| </fieldType> | |||||
| <!-- END --> | |||||
| </schema> | </schema> |
| from .random import random as random_blueprint | from .random import random as random_blueprint | ||||
| app.register_blueprint(random_blueprint) | app.register_blueprint(random_blueprint) | ||||
| # blueprint for data parts of app | |||||
| from .data import data as data_blueprint | |||||
| app.register_blueprint(data_blueprint) | |||||
| return app | return app |
| # @name: data.py | |||||
| # @creation_date: 2022-09-14 | |||||
| # @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
| # @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
| # @purpose: data route for data | |||||
| # @acknowledgements: | |||||
| # | |||||
| from flask import Blueprint, render_template, request | |||||
| import random | |||||
| import pycountry | |||||
| from . import solr | |||||
| data = Blueprint('data', __name__) | |||||
| # route for main data page | |||||
| @data.route('/data/') | |||||
| def main_data(): | |||||
| core = 'all' | |||||
| total_number = solr.get_total_number(core) | |||||
| year_data = solr.get_term_data('year', core) | |||||
| country_data = solr.get_term_data('country', core) | |||||
| # parse all the year data | |||||
| year_labels = [] | |||||
| year_numbers = [] | |||||
| year_dataset = [] | |||||
| for i in range(0, len(year_data)): | |||||
| if i % 2: | |||||
| year_numbers.append(year_data[i]) | |||||
| random_colour = "#" + "%06x" % random.randint(0, 0xFFFFFF) | |||||
| year_dict = {"label": "number of records", "data": year_numbers, "backgroundColor": random_colour} | |||||
| else: | |||||
| year_labels.append(year_data[i]) | |||||
| year_dataset.append(year_dict) | |||||
| # parse all the country data | |||||
| country_labels = [] | |||||
| country_numbers = [] | |||||
| country_dataset = [] | |||||
| for i in range(0, len(country_data)): | |||||
| if i % 2: | |||||
| country_numbers.append(country_data[i]) | |||||
| random_colour = "#" + "%06x" % random.randint(0, 0xFFFFFF) | |||||
| country_dict = {"label": "number of records", "data": country_numbers, "backgroundColor": random_colour} | |||||
| else: | |||||
| country = pycountry.countries.get(alpha_2=country_data[i]) | |||||
| if country is None: | |||||
| country = pycountry.historic_countries.get(alpha_2=country_data[i]) | |||||
| country_labels.append(country.name) | |||||
| country_dataset.append(country_dict) | |||||
| germany = pycountry.countries.get(alpha_2='DE') | |||||
| return render_template('data.html', total_number=total_number, year_data=year_data, year_labels=year_labels, year_dataset=year_dataset, country_data=country_data, country_labels=country_labels, country_dataset=country_dataset, germany=germany) |
| # @acknowledgements: | # @acknowledgements: | ||||
| # https://www.digitalocean.com/community/tutorials/how-to-add-authentication-to-your-app-with-flask-login | # https://www.digitalocean.com/community/tutorials/how-to-add-authentication-to-your-app-with-flask-login | ||||
| from flask import Blueprint, render_template, request | |||||
| from flask import Blueprint, render_template, request, redirect, url_for | |||||
| from . import solr | from . import solr | ||||
| from . import ops | from . import ops | ||||
| search = Blueprint('search', __name__) | search = Blueprint('search', __name__) | ||||
| # route for search page | # route for search page | ||||
| @search.route('/search/', methods=['POST']) | |||||
| @search.route('/search/', methods=['GET', 'POST']) | |||||
| def basic_search(): | def basic_search(): | ||||
| search = request.form.get('search') | |||||
| if request.form.get('core') is not None: | |||||
| core = request.form.get('core') | |||||
| if request.method == 'POST': | |||||
| search = request.form.get('search') | |||||
| if request.form.get('core') is not None: | |||||
| core = request.form.get('core') | |||||
| else: | |||||
| core = 'all' | |||||
| if request.form.get('sort') is not None: | |||||
| sort = request.form.get('sort') | |||||
| else: | |||||
| sort = 'relevance' | |||||
| search_results = solr.solr_search(core, sort, search) | |||||
| results = search_results[0] | |||||
| num_found = search_results[1] | |||||
| return render_template('search.html', results=results, num_found=num_found, search=search, core=core, sort=sort) | |||||
| else: | else: | ||||
| core = 'all' | |||||
| if request.form.get('sort') is not None: | |||||
| sort = request.form.get('sort') | |||||
| else: | |||||
| sort = 'relevance' | |||||
| search_results = solr.solr_search(core, sort, search) | |||||
| results = search_results[0] | |||||
| num_found = search_results[1] | |||||
| return render_template('search.html', results=results, num_found=num_found, search=search, core=core, sort=sort) | |||||
| return redirect(url_for('main.index')) | |||||
| # route for id_search page | # route for id_search page | ||||
| @search.route('/search/id/') | |||||
| @search.route('/search/id/', methods=['GET']) | |||||
| def id_search(): | def id_search(): | ||||
| if request.args.get('id') is None: | |||||
| return redirect(url_for('main.index')) | |||||
| if request.args.get('core') is not None: | if request.args.get('core') is not None: | ||||
| core = request.args.get('core') | core = request.args.get('core') | ||||
| else: | else: |
| doc_ref = re.search('=D\s(([^\s]*)\s([^\s]*)\s([^\s]*))', input) | doc_ref = re.search('=D\s(([^\s]*)\s([^\s]*)\s([^\s]*))', input) | ||||
| if doc_ref is None: | if doc_ref is None: | ||||
| doc_ref = re.search('=D&locale=en_EP\s(([^\s]*)\s([^\s]*)\s([^\s]*))', input) | doc_ref = re.search('=D&locale=en_EP\s(([^\s]*)\s([^\s]*)\s([^\s]*))', input) | ||||
| output['doc_ref'] = doc_ref.group(1).replace(" ","") | |||||
| if doc_ref is None: | |||||
| output['doc_ref'] = "" | |||||
| else: | |||||
| output['doc_ref'] = doc_ref.group(1).replace(" ","") | |||||
| else: | else: | ||||
| output['doc_ref'] = doc_ref.group(1).replace(" ","") | output['doc_ref'] = doc_ref.group(1).replace(" ","") | ||||
| output.append(result) | output.append(result) | ||||
| i += 1 | i += 1 | ||||
| return output | return output | ||||
| def get_total_number(core): | |||||
| # Assemble a query string to send to Solr. This uses the Solr hostname from config.env. Solr's query syntax can be found at many sites including https://lucene.apache.org/solr/guide/6_6/the-standard-query-parser.html | |||||
| solrurl = 'http://' + solr_hostname + ':' + solr_port + '/solr/' + core + '/select?q.op=OR&q=*:*&wt=json' | |||||
| # get result | |||||
| request = requests.get(solrurl) | |||||
| # turn the API response into useful Json | |||||
| json = request.json() | |||||
| num_found = json['response']['numFound'] | |||||
| return num_found | |||||
| def get_term_data(field, core): | |||||
| # Assemble a query string to send to Solr. This uses the Solr hostname from config.env. Solr's query syntax can be found at many sites including https://lucene.apache.org/solr/guide/6_6/the-standard-query-parser.html | |||||
| solrurl = 'http://' + solr_hostname + ':' + solr_port + '/solr/' + core + '/terms?terms.fl=' + field + '&wt=json&terms.limit=1000' | |||||
| # get result | |||||
| request = requests.get(solrurl) | |||||
| # turn the API response into useful Json | |||||
| json = request.json() | |||||
| output = json['terms'][field] | |||||
| return output |
| <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script> | <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script> | ||||
| <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> | <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> | ||||
| <script src="{{ url_for('static',filename='js/main.js') }}"></script> | <script src="{{ url_for('static',filename='js/main.js') }}"></script> | ||||
| <!-- JavaScript for Chart.js --> | |||||
| <script src="https://cdn.jsdelivr.net/npm/chart.js@3.8.0/dist/chart.min.js"></script> | |||||
| </head> | </head> | ||||
| {% block body %} | {% block body %} |
| {% extends "base.html" %} | |||||
| {% block content %} | |||||
| <a href="{{ url_for('main.index') }}" class="h1 text-left"> ⇽ </a> | |||||
| There are a total of {{ total_number }} patents. | |||||
| <br><br> | |||||
| <canvas id="chartOfYearFrequency" width="600" height="300"></canvas> | |||||
| <canvas id="chartOfCountryFrequency" width="600" height="300"></canvas> | |||||
| <script type="text/javascript"> | |||||
| // retrieve variables passed from Python | |||||
| var year_labels = {{ year_labels|safe }} | |||||
| var year_dataset = {{ year_dataset|safe }} | |||||
| // set up chart | |||||
| var data = { | |||||
| labels: year_labels, | |||||
| datasets: year_dataset, | |||||
| }; | |||||
| var config = { | |||||
| type: 'bar', | |||||
| data: data, | |||||
| options: { | |||||
| plugins: { | |||||
| title: { | |||||
| display: true, | |||||
| text: 'number of patent records for each year' | |||||
| }, | |||||
| }, | |||||
| responsive: true, | |||||
| scales: { | |||||
| x: { | |||||
| title: { | |||||
| display: true, | |||||
| text: 'year' | |||||
| }, | |||||
| stacked: true, | |||||
| }, | |||||
| y: { | |||||
| title: { | |||||
| display: true, | |||||
| text: 'number of records' | |||||
| }, | |||||
| stacked: true | |||||
| } | |||||
| } | |||||
| } | |||||
| }; | |||||
| var yearGraph = new Chart( | |||||
| document.getElementById('chartOfYearFrequency'), | |||||
| config | |||||
| ); | |||||
| </script> | |||||
| <script type="text/javascript"> | |||||
| // retrieve variables passed from Python | |||||
| var country_labels = {{ country_labels|safe }} | |||||
| var country_dataset = {{ country_dataset|safe }} | |||||
| // set up chart | |||||
| var data = { | |||||
| labels: country_labels, | |||||
| datasets: country_dataset, | |||||
| }; | |||||
| var config = { | |||||
| type: 'bar', | |||||
| data: data, | |||||
| options: { | |||||
| plugins: { | |||||
| title: { | |||||
| display: true, | |||||
| text: 'number of patent records from each country' | |||||
| }, | |||||
| }, | |||||
| responsive: true, | |||||
| scales: { | |||||
| x: { | |||||
| title: { | |||||
| display: true, | |||||
| text: 'country' | |||||
| }, | |||||
| stacked: true, | |||||
| }, | |||||
| y: { | |||||
| title: { | |||||
| display: true, | |||||
| text: 'number of records' | |||||
| }, | |||||
| stacked: true | |||||
| } | |||||
| } | |||||
| } | |||||
| }; | |||||
| var yearGraph = new Chart( | |||||
| document.getElementById('chartOfCountryFrequency'), | |||||
| config | |||||
| ); | |||||
| </script> | |||||
| {% endblock %} |
| markdown | markdown | ||||
| requests | requests | ||||
| Wand | Wand | ||||
| pycountry |