From ad7185bfcec9f3ffedd13ebc72f45aa01b9a76cc Mon Sep 17 00:00:00 2001 From: Puthita S Date: Sun, 9 Oct 2022 17:41:53 +0700 Subject: [PATCH 1/2] init --- employee_visualizer/employees/views.py | 135 +++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 employee_visualizer/employees/views.py diff --git a/employee_visualizer/employees/views.py b/employee_visualizer/employees/views.py new file mode 100644 index 0000000..6940119 --- /dev/null +++ b/employee_visualizer/employees/views.py @@ -0,0 +1,135 @@ +from django.shortcuts import render +from django.http import HttpResponse, JsonResponse +from django.core import serializers +from .models import Employee +from datetime import datetime + +import os +import xmltodict +import json + +# *************** chart stat *************** +def stat_group_job_position(): + labels = [] + data = [] + + object_list = Employee.objects.all() + employees = serializers.serialize('python', object_list) + for employee in employees: + position = employee['fields']['position'] + if position not in labels: + labels.append(position) + + for label in labels: + data.append(sum(map(lambda emp : emp['fields']['position'] == label, employees))) + + return { + 'labels': labels, + 'data': data + } + +def stat_group_hired_by_gender(collecting_history_year): + years = [] + males = [] + females = [] + + object_list = Employee.objects.all() + employees = serializers.serialize('python', object_list) + # get last year of employee hired + print([employee['fields']['hired'] for employee in employees]) + last_emp_hired_year = max(dt for dt in [employee['fields']['hired'] for employee in employees]).year + last_emp_hired_year = last_emp_hired_year + 1 + for year in range(last_emp_hired_year - collecting_history_year, last_emp_hired_year): + years.append(year) + males.append(sum(map(lambda emp : emp['fields']['gender'] == 0 and emp['fields']['hired'].year == year, employees))) + females.append(sum(map(lambda emp: emp['fields']['gender'] == 1 and emp['fields']['hired'].year == year, employees))) + + return { + 'years': years, + 'males': males, + 'females': females + } + +# *************** index *************** +def index(request): + context = { + 'stat_group_job_position': stat_group_job_position(), + 'stat_group_hired_by_gender': stat_group_hired_by_gender(10) + } + return render(request, 'index.html', context) + +def get_employees(request): + object_list = Employee.objects.all() + employees = serializers.serialize('python', object_list) + for employee in employees: + if employee['fields']['gender'] == 0: + employee['fields']['gender'] = 'Male' + else: + employee['fields']['gender'] = 'Female' + + if employee['fields']['status'] == 1: + employee['fields']['status'] = 'Active' + + return JsonResponse(employees, safe=False) + + + + + +# ********** load data from file *********** +def clean_data(data_dict): + temp_dict = {} + pristine_records = [] + + for index in range(len(data_dict['records']['record'])): + record = data_dict['records']['record'][index] + emp_id = record['EMPID'] + passport_no = record['PASSPORT'] + if emp_id in temp_dict and passport_no in temp_dict[emp_id]: + print('found duplicate on employee id: {} and passport no: {} > ignore'.format(emp_id, passport_no)) + elif 'GENDER' in record and record['GENDER'] not in ['0', '1']: + print('wrong gender type ({}) > ignore'.format(record['GENDER'])) + elif 'STATUS' in record and record['STATUS'] not in ['1', '2', '3']: + print('wrong status type ({}) > ignore'.format(record['STATUS'])) + elif 'STATUS' in record and record['STATUS'] != '1': + print('employee status not active ({}) > ignore'.format(record['STATUS'])) + else: + if emp_id not in temp_dict: + temp_dict[emp_id] = {} + temp_dict[emp_id][passport_no] = 'checked' + pristine_records.append(record) + + data_dict['records']['record'] = pristine_records + return data_dict + +def load_init_employees_trigger(request): + script_path = os.path.realpath(os.path.dirname(__file__)) + with open('{}/../../data-devclub-1.xml'.format(script_path)) as xml_file: + data_devclub_dict = xmltodict.parse(xml_file.read()) + pristine_data = clean_data(data_devclub_dict) + + # write json file + json_data = json.dumps(pristine_data) + with open('{}/../data-devclub.json'.format(script_path), 'w') as json_file: + json_file.write(json_data) + + Employee.objects.all().delete() + employees = pristine_data['records']['record'] + for employee in employees: + record = Employee( + emp_id = employee['EMPID'], + passport = employee['PASSPORT'], + firstname = employee['FIRSTNAME'], + lastname = employee['LASTNAME'], + gender = employee['GENDER'], + birthday = datetime.strptime(employee['BIRTHDAY'], '%d-%m-%Y'), + nationality = employee['NATIONALITY'], + hired = datetime.strptime(employee['HIRED'], '%d-%m-%Y'), + dept = employee['DEPT'], + position = employee['POSITION'], + status = employee['STATUS'], + region = employee['REGION'] + ) + record.save() + + return HttpResponse('Data clean and loaded') From 5a64b27d7f9375882b3a063aecd4eb0898d566b9 Mon Sep 17 00:00:00 2001 From: Puthita S Date: Sun, 9 Oct 2022 17:42:04 +0700 Subject: [PATCH 2/2] init --- .gitignore | 1 + employee_visualizer/data-devclub.json | 1 + employee_visualizer/db.sqlite3 | Bin 0 -> 147456 bytes .../employee_visualizer/__init__.py | 0 .../employee_visualizer/asgi.py | 16 ++ .../employee_visualizer/settings.py | 124 ++++++++++++++ .../employee_visualizer/urls.py | 22 +++ .../employee_visualizer/wsgi.py | 16 ++ employee_visualizer/employees/__init__.py | 0 employee_visualizer/employees/admin.py | 3 + employee_visualizer/employees/apps.py | 6 + .../employees/migrations/0001_initial.py | 32 ++++ ...r_employee_gender_alter_employee_status.py | 23 +++ ..._rename_natinality_employee_nationality.py | 18 +++ .../employees/migrations/__init__.py | 0 employee_visualizer/employees/models.py | 27 ++++ .../employees/templates/index.html | 151 ++++++++++++++++++ employee_visualizer/employees/tests.py | 3 + employee_visualizer/employees/urls.py | 8 + employee_visualizer/manage.py | 22 +++ 20 files changed, 473 insertions(+) create mode 100644 .gitignore create mode 100644 employee_visualizer/data-devclub.json create mode 100644 employee_visualizer/db.sqlite3 create mode 100644 employee_visualizer/employee_visualizer/__init__.py create mode 100644 employee_visualizer/employee_visualizer/asgi.py create mode 100644 employee_visualizer/employee_visualizer/settings.py create mode 100644 employee_visualizer/employee_visualizer/urls.py create mode 100644 employee_visualizer/employee_visualizer/wsgi.py create mode 100644 employee_visualizer/employees/__init__.py create mode 100644 employee_visualizer/employees/admin.py create mode 100644 employee_visualizer/employees/apps.py create mode 100644 employee_visualizer/employees/migrations/0001_initial.py create mode 100644 employee_visualizer/employees/migrations/0002_alter_employee_gender_alter_employee_status.py create mode 100644 employee_visualizer/employees/migrations/0003_rename_natinality_employee_nationality.py create mode 100644 employee_visualizer/employees/migrations/__init__.py create mode 100644 employee_visualizer/employees/models.py create mode 100644 employee_visualizer/employees/templates/index.html create mode 100644 employee_visualizer/employees/tests.py create mode 100644 employee_visualizer/employees/urls.py create mode 100755 employee_visualizer/manage.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..600d2d3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode \ No newline at end of file diff --git a/employee_visualizer/data-devclub.json b/employee_visualizer/data-devclub.json new file mode 100644 index 0000000..5379eaf --- /dev/null +++ b/employee_visualizer/data-devclub.json @@ -0,0 +1 @@ +{"records": {"record": [{"EMPID": "2", "PASSPORT": "CDC87ETW8EQ", "FIRSTNAME": "Burton", "LASTNAME": "Gallegos", "GENDER": "0", "BIRTHDAY": "22-09-1960", "NATIONALITY": "Germany", "HIRED": "29-10-2021", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "APAC"}, {"EMPID": "3", "PASSPORT": "JUI65YBK7AF", "FIRSTNAME": "Jada", "LASTNAME": "Bender", "GENDER": "0", "BIRTHDAY": "28-05-1963", "NATIONALITY": "Pakistan", "HIRED": "11-02-2001", "DEPT": "Pilot", "POSITION": "Pilot", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "5", "PASSPORT": "AZE20CSG4MU", "FIRSTNAME": "Lillian", "LASTNAME": "Reese", "GENDER": "0", "BIRTHDAY": "03-12-1982", "NATIONALITY": "Ukraine", "HIRED": "19-05-2002", "DEPT": "Flight Planning", "POSITION": "Steward", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "23", "PASSPORT": "NFH65BYM0VB", "FIRSTNAME": "Armand", "LASTNAME": "Horn", "GENDER": "0", "BIRTHDAY": "24-05-1987", "NATIONALITY": "Netherlands", "HIRED": "19-06-2007", "DEPT": "Aircraft Maintenance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Ocenia"}, {"EMPID": "29", "PASSPORT": "CMK62UAD3VK", "FIRSTNAME": "Rowan", "LASTNAME": "Leonard", "GENDER": "1", "BIRTHDAY": "15-07-1974", "NATIONALITY": "Germany", "HIRED": "27-03-2004", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "Ocenia"}, {"EMPID": "33", "PASSPORT": "EWD45RJW5YK", "FIRSTNAME": "Carter", "LASTNAME": "Velasquez", "GENDER": "0", "BIRTHDAY": "23-11-1967", "NATIONALITY": "Indonesia", "HIRED": "27-02-2005", "DEPT": "Flight Planning", "POSITION": "Pilot", "STATUS": "1", "REGION": "APAC"}, {"EMPID": "34", "PASSPORT": "BFS82MEY3CX", "FIRSTNAME": "Selma", "LASTNAME": "Bush", "GENDER": "0", "BIRTHDAY": "26-03-1972", "NATIONALITY": "Italy", "HIRED": "10-10-2008", "DEPT": "Flight Attendance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "USA"}, {"EMPID": "50", "PASSPORT": "MRC33GHJ2KW", "FIRSTNAME": "Calvin", "LASTNAME": "Roach", "GENDER": "1", "BIRTHDAY": "16-04-1999", "NATIONALITY": "Mexico", "HIRED": "18-03-2011", "DEPT": "Flight Attendance", "POSITION": "Steward", "STATUS": "1", "REGION": "Europe"}, {"EMPID": "66", "PASSPORT": "WKV12UQC6QF", "FIRSTNAME": "Zachery", "LASTNAME": "Valentine", "GENDER": "0", "BIRTHDAY": "04-06-1971", "NATIONALITY": "Philippines", "HIRED": "25-08-2011", "DEPT": "Flight Attendance", "POSITION": "Steward", "STATUS": "1", "REGION": "Middle East"}, {"EMPID": "80", "PASSPORT": "EUC74ENE9ZK", "FIRSTNAME": "Ryan", "LASTNAME": "Rush", "GENDER": "0", "BIRTHDAY": "13-06-1998", "NATIONALITY": "Italy", "HIRED": "31-07-2019", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "Middle East"}, {"EMPID": "93", "PASSPORT": "UXL43IOW6OV", "FIRSTNAME": "Honorato", "LASTNAME": "Maxwell", "GENDER": "1", "BIRTHDAY": "09-03-1982", "NATIONALITY": "France", "HIRED": "04-02-2017", "DEPT": "Aircraft Maintenance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Europe"}, {"EMPID": "95", "PASSPORT": "OUP31WOE2IE", "FIRSTNAME": "Dara", "LASTNAME": "Wilcox", "GENDER": "1", "BIRTHDAY": "29-06-1996", "NATIONALITY": "Singapore", "HIRED": "18-05-2011", "DEPT": "Flight Attendance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "97", "PASSPORT": "SUF73DKV4QE", "FIRSTNAME": "Dante", "LASTNAME": "Hart", "GENDER": "0", "BIRTHDAY": "21-12-1999", "NATIONALITY": "Peru", "HIRED": "22-02-2016", "DEPT": "Pilot", "POSITION": "Pilot", "STATUS": "1", "REGION": "Europe"}]}} \ No newline at end of file diff --git a/employee_visualizer/db.sqlite3 b/employee_visualizer/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..e6ab09a89b067bcc446fd08f38ed02fb16e883b5 GIT binary patch literal 147456 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 F{vR%p^4 + + + + + + Employee + + + + + + + + + + +

+

Employee

+ +
+
+
+
+
Job Position
+ +
+
+
+
+
+
+
Hired
+ +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
IDEmployeeIDPassportFirstnameLastnameGenderDath of BirthNationalityHired DateDeptPositionStatusRegion
+
+ + + + + + + + \ No newline at end of file diff --git a/employee_visualizer/employees/tests.py b/employee_visualizer/employees/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/employee_visualizer/employees/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/employee_visualizer/employees/urls.py b/employee_visualizer/employees/urls.py new file mode 100644 index 0000000..79e73eb --- /dev/null +++ b/employee_visualizer/employees/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.index, name='index'), + path('fetch/', views.get_employees, name='get_employees'), + path('load_init_employees_trigger/', views.load_init_employees_trigger, name='load_init_employees_trigger') +] \ No newline at end of file diff --git a/employee_visualizer/manage.py b/employee_visualizer/manage.py new file mode 100755 index 0000000..7ec52c6 --- /dev/null +++ b/employee_visualizer/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'employee_visualizer.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main()