From d4633ff894782a22a2c9c198f8070fbd43528d66 Mon Sep 17 00:00:00 2001 From: olima957 <olima957@student.liu.se> Date: Tue, 22 Oct 2024 21:47:35 +0200 Subject: [PATCH] Laddade upp uppdaterade python filer. --- MyPortfolio/data.py | 137 +++++++++++++++++----------------- MyPortfolio/myFlaskProject.py | 5 ++ 2 files changed, 75 insertions(+), 67 deletions(-) diff --git a/MyPortfolio/data.py b/MyPortfolio/data.py index 318064d..6313c09 100644 --- a/MyPortfolio/data.py +++ b/MyPortfolio/data.py @@ -1,30 +1,28 @@ #!/.venv/bin/python -# TODO - -# Gör project_id dynamisk så att den uppdateras efter borttagning/addering av projekt. # ---- IMPORTS ---- # -import os -import json -import pprint -import re -import unicodedata -from operator import itemgetter +import os # Import os module for cls and executing commands through python +import json # Import json so we can handle our data.json file +import pprint # Pretty print for debugging +import re # Not used atm +import unicodedata # Not used atm +from operator import itemgetter # Used for sorting our results after a specific option. # ---- IMPORTS ---- # - +# Opens a file and reads it so it's contents can be used as data for the program def load(filename): try: + # Opens file with R (read) with UTF 8 encoding as file with open(filename, 'r', encoding='utf-8') as file: - data = json.load(file) + data = json.load(file) # Assigns the file contents to data as json - file.close() - return data + file.close() # Close the file + return data except: return None - +# WIP def save(data): with open('data.json', 'w', encoding='utf-8') as file: json.dump(data, file, ensure_ascii=False, indent=4) @@ -37,93 +35,95 @@ def save(data): # Get project count def get_project_count(data): - return len(data) + return len(data) # Returns the len of the data list which is equivalent to the amount of projects # Get project by ID def get_project(data, id): + # Loops over a range with the length of the amount of projects present and gets a project if it matches the passed ID. for n in range(0, get_project_count(data)): - if data[n]['project_id'] == id: - return data[n] + if data[n]['project_id'] == id: # If the current projects ID corresponds to the ID we're looking for then... + return data[n] # Return the project at that index # Get all unique techniques from project def get_techniques(data): - techniques = [] - for project in data: - for tech in project['techniques_used']: - if tech not in techniques: - techniques.append(tech) + techniques = [] # A list which will store the techniques found + for project in data: # For every project in our data + for tech in project['techniques_used']: # For every technique in that project + if tech not in techniques: # If it's not in the previously techniques, it's unique. + techniques.append(tech) # Append it to the list. - techniques.sort() + techniques.sort() # Sort it so it'll look nice. return techniques -# Gets all unique techniques from all projects ! COULD USE SOME FILTERING ! +# Gets all unique techniques from all projects. ( NOT USED? ) def get_technique_stats(data): - technique_list = get_techniques(data) - technique_stats = {} - current_techniques = [] + technique_list = get_techniques(data) # Get all the unique techniques so we know what techniques we can expect. + technique_stats = {} # Creates a dictionary which will contain the id as a key and the name as a value. + current_techniques = [] # A list which will contain the found techniques. - for technique in technique_list: - for project in data: - if technique in project['techniques_used']: - current_techniques.append({'id': project['project_id'], 'name': project['project_name']}) + for technique in technique_list: # For each unique technique we found with get_techniques()... + for project in data: # For every project in data, as we need to look over them all for each technique. + if technique in project['techniques_used']: # If the technique we're currently looking for is in the used techniques of the project we're iterating over. + current_techniques.append({'id': project['project_id'], 'name': project['project_name']}) # Create a new dict INSIDE the list with the project ID and project name. - technique_stats.update({technique: current_techniques.copy()}) - current_techniques.clear() + technique_stats.update({technique: current_techniques.copy()}) # Updates the dictionary with the list WITH a dict inside. + current_techniques.clear() # Clears the buffer so a new key value pair can be created. - return technique_stats + return technique_stats # Return a dict with all techniques and the projects which uses them. # Fetches and sorts projects matching criteria from the specified list. def search(data, sort_by='start_date', sort_order='desc', techniques=None, search=None, search_fields=None): + # If search str belongs to search and if so, make search lower case. if isinstance(search, str): search = search.lower() results = [] # get it - for project in data: - results.append(project) + for project in data: # For each project in data + results.append(project) # Add all projects in data # sort it - results = sorted(results, key=itemgetter(sort_by)) + results = sorted(results, key=itemgetter(sort_by)) # Sorts our results based on a specific variable by using a lambda function with itemgetter. # order it - if sort_order == 'desc': + if sort_order == 'desc': # If the sort order is set to desc, then reverse the list. results.reverse() # filter it (by techniques) - if techniques is not None: - for technique in get_techniques(data): - for project in results: - if all(n in project['techniques_used'] for n in techniques): - pass + if techniques is not None: # If there are techniques which are going to be filtered by.. + for technique in get_techniques(data): # For each unique technique.. + for project in results: # And for each project we've found so far.. + if all(n in project['techniques_used'] for n in techniques): # If all the techniques we're looking for are inside the projects technique_used field.. + pass # Then do nothing.. else: - results.pop(results.index(project)) + results.pop(results.index(project)) # Otherwise remove it from our results. # search for it - if search is not None: - search_results = [] - - for project in results: - if search_fields is not None and search_fields != "" and search != "" and search_fields != ['None']: - for field in search_fields: - substring = project[field] - # Check type before calling lower() + if search is not None: # If the search field isn't set to None.. + search_results = [] # Create a list for our search results.. + + for project in results: # For every project we've found so far.. + if search_fields is not None and search_fields != "" and search != "" and search_fields != ['None']: # If the searchf ield is not set to None AND search_fields is not empty AND search_fields is not an empty list.. + for field in search_fields: # For each field in search fields.. + substring = project[field] # Save the current field in substring so we can do operations on it.. + # Check types before calling lower() if isinstance(substring, str): - substring = substring.lower() - if substring.find(search) != -1: + substring = substring.lower() # Make case insensitive + if substring.find(search) != -1: # If found search_results.append(project) break - elif isinstance(substring, int): + elif isinstance(substring, int): if str(substring).find(search) != -1: search_results.append(project) break - elif isinstance(substring, list): - for subsubstring in substring: - if isinstance(subsubstring, str): + elif isinstance(substring, list): # If it's a list.. + for subsubstring in substring: # We'll need to make another substring so we can iterate over each index of the list instead of just for multiple lists. + if isinstance(subsubstring, str): if subsubstring.lower().find(search) != -1: search_results.append(project) break @@ -132,8 +132,8 @@ def search(data, sort_by='start_date', sort_order='desc', techniques=None, searc search_results.append(project) break - elif search_fields == "": - results.clear() + elif search_fields == "": # And if the search_fields is empty.. + results.clear() # Clear all results break else: @@ -158,16 +158,19 @@ def search(data, sort_by='start_date', sort_order='desc', techniques=None, searc search_results.append(project) break - results = search_results + results = search_results # Make results into search_results as they should be the same + + return results # Returns our results. - return results + +# WIP def cls(): os.system('cls' if os.name == 'nt' else 'clear') pass - +# WIP def new_project(data): cls() @@ -205,14 +208,14 @@ def new_project(data): pass - +# WIP def list_projects(data): cls() for project in data: pprint.pp(project) print("\n") - +# WIP def edit_project(data, id): while True: if id > get_project_count(data) or id < 0: @@ -232,11 +235,11 @@ def edit_project(data, id): input("\nField to edit: ") - +# WIP def delete_project(data): pass - +# WIP def menu(data): menu_items = ["Add new project", "List projects", "Edit existing project", "Delete project", "Quit"] menu_index = 0 diff --git a/MyPortfolio/myFlaskProject.py b/MyPortfolio/myFlaskProject.py index d8dc77f..f2e7ca4 100644 --- a/MyPortfolio/myFlaskProject.py +++ b/MyPortfolio/myFlaskProject.py @@ -11,6 +11,8 @@ def index(): @app.route("/list", methods=['GET', 'POST']) def list(): + + # Gets POST data from forms search_query = request.form.get('search', '') sort_by = request.form.get('sort_by', 'start_date') sort_order = request.form.get('sort_order', 'desc') @@ -22,6 +24,7 @@ def list(): sort_by=sort_by, sort_order=sort_order) +# Converts ID to int incase it's passed as string @app.route("/project/<int:project_id>") def project_details(project_id): project = get_project(load('data.json'), project_id) @@ -33,8 +36,10 @@ def project_details(project_id): @app.route("/techniques", methods=['GET', 'POST']) def techniques(): + # Gets all unique techniques in our projects using get_technique_stats function. techniques = get_technique_stats(load('data.json')) + # Gets POST data from forms search_query = request.form.get('search', '') sort_by = request.form.get('sort_by', 'start_date') sort_order = request.form.get('sort_order', 'desc') -- GitLab