From 6af202442c56ddda29f58ba35bff620f366dd42e Mon Sep 17 00:00:00 2001 From: Emilie Zawadzki Date: Wed, 11 Jan 2017 17:23:07 +0100 Subject: [PATCH] [Timesheet] : import projects > ok --- .../commands/import-ircam-project.py | 121 +++++++++++------- 1 file changed, 78 insertions(+), 43 deletions(-) diff --git a/app/organization/network/management/commands/import-ircam-project.py b/app/organization/network/management/commands/import-ircam-project.py index 9436201a..74408344 100644 --- a/app/organization/network/management/commands/import-ircam-project.py +++ b/app/organization/network/management/commands/import-ircam-project.py @@ -68,84 +68,116 @@ def get_instance(model, field, value): return model +def format_message(project): + message = str(project.id) + " | " + message += project.title + " | " + message += project.external_id if project.external_id else "None" + return message + + class IrcamXLS: sheet_id = 0 project_table_1_first_row = 12 project_table_1_last_row = 25 project_table_2_first_row = 34 - project_table_2_last_row = 89 + project_table_2_last_row = 90 nb_col_max = 9 nb_col_min = 0 avoid_col = 3 def __init__(self, file): + self.book = xlrd.open_workbook(file) self.sheet = self.book.sheet_by_index(self.sheet_id) class IrcamProjects(object): def __init__(self, project_name): - project, is_created = Project.object.get_or_create(title__icontains=project_name) + project, is_created = Project.objects.get_or_create(title=project_name) self.project = project self.is_created = is_created + if self.is_created: + self.project.title = project_name def set_external_id(self, external_id): - if external_id and not self.project.external_id: + if external_id and self.project.external_id is None: + if isinstance(external_id, float): + external_id = str(int(external_id)) external_id = re.sub(r'((\s)*(-)(\s)*)|(\s)', '-', external_id) self.project.external_id = external_id def set_call_project(self, call): - if call and not self.project.call: - self.project.call = ProjectCall.objects.get_or_create(name__icontains=call) + if call and self.project.call is None: + project_call, is_created = ProjectCall.objects.get_or_create(name__icontains=call) + if is_created: + project_call.name = call + project_call.save() + self.project.call = project_call def set_date_from(self, date_from): - if date_from and not self.project.date_from: + if date_from and self.project.date_from is None: self.project.date_from = date_from def set_date_to(self, date_to): - if date_to and not self.project.date_to: + if date_to and self.project.date_to is None: self.project.date_to = date_to def set_lead_organization(self, lead_organization): - if lead_organization and not self.project.lead_organization: - self.project.lead_organization.add(Organization.objects.get_or_create(title__icontains=lead_organization)) + if lead_organization and self.project.lead_organization is None: + lo, is_created = Organization.objects.get_or_create(name=lead_organization) + self.project.lead_organization = lo def set_referring_person(self, referring_person): - if referring_person and not self.project.referring_person: - referring_person_list = re.split(r'(\s)*/(\s)*', referring_person) - person_list = () + if referring_person and self.project.referring_person is None: + referring_person_list = re.split(r'\s*/\s*', referring_person, 1) for rp in referring_person_list: - rp_whole_name = re.split(r'(\s)*', rp) + rp_whole_name = re.split(r'\s*', rp, 1) last_name = max(rp_whole_name, key=len) - self.project.referring_person.add(Person.objects.get_or_create(last_name__icontains=last_name)) + initial_first_name = min(rp_whole_name, key=len) + initial_first_name = re.sub(r'\.', '', initial_first_name) + persons = Person.objects.filter(last_name__icontains=last_name) + for person in persons: + if person.first_name[0] == initial_first_name: + self.project.referring_person.add(person) def set_teams(self, lead_teams): - if lead_teams and not self.project.lead_team: - lead_teams_list = re.split(r'(\s)*(,|/)(\s)*', lead_teams) - self.project.lead_team.add(lead_teams) + if lead_teams and self.project.lead_team is None: + lead_teams_list = re.split(r'\s*,\s*', lead_teams, 1) + for lt in lead_teams_list: + t, is_created = Team.objects.get_or_create(code__icontains=lt) + if is_created: + t.title = lt + t.save() + self.project.teams.add(t) def set_manager(self, manager): - if manager: - if not self.project.manager: - self.project.manager = Person.objects.get_or_create(last_name__icontains=manager) - - - def save_project(): + if manager and self.project.manager is None : + manager_whole_name = re.split(r'\s*', manager, 1) + last_name = max(manager_whole_name, key=len) + initial_first_name = min(manager_whole_name, key=len) + initial_first_name = re.sub(r'\.', '', initial_first_name) + persons = Person.objects.filter(last_name__icontains=last_name) + for person in persons: + if person.first_name[0] == initial_first_name: + self.project.manager.add(person) + + + def save_project(self): self.project.save() class Command(BaseCommand): help = """Import Person data from IRCAM's legacy XLS management file. - python manage.py import-ircam-timesheet-xls -s /srv/backup/TemplateInputTimeSheet2015-16.xlsx + python manage.py import-ircam-project -s /srv/backup/projects_rd_jan17.xlsx """ option_list = BaseCommand.option_list + ( @@ -176,29 +208,32 @@ class Command(BaseCommand): # Table 1 for row_index in range(xls.project_table_1_first_row, xls.project_table_1_last_row): - - ip = IrcamProjects(sheet.cell_value(0, row_index)) - ip.set_external_id(sheet.cell_value(1, row_index)) - ip.set_call_project(sheet.cell_value(2, row_index)) - ip.set_date_from(xlrd.xldate.xldate_as_datetime(sheet.cell_value(4, row_index)), 1)) - ip.set_date_to(xlrd.xldate.xldate_as_datetime(sheet.cell_value(5, row_index)) - ip.set_lead_organization(sheet.cell_value(6, row_index)) - ip.set_referring_person(sheet.cell_value(7, row_index)) - ip.set_teams(sheet.cell_value(8, row_index)) - ip.set_manager(sheet.cell_value(9, row_index)) + ip = IrcamProjects(xls.sheet.cell_value(row_index, 0)) + ip.set_external_id(xls.sheet.cell_value(row_index, 1)) + ip.set_call_project(xls.sheet.cell_value(row_index, 2)) + ip.set_date_from(xlrd.xldate.xldate_as_datetime(xls.sheet.cell_value(row_index, 4), 1)) + ip.set_date_to(xlrd.xldate.xldate_as_datetime(xls.sheet.cell_value(row_index, 5), 1)) + ip.set_lead_organization(xls.sheet.cell_value(row_index, 6)) + ip.set_referring_person(xls.sheet.cell_value(row_index, 7)) + ip.set_teams(xls.sheet.cell_value(row_index, 8)) + ip.set_manager(xls.sheet.cell_value(row_index, 9)) ip.save_project() + self.logger.info('Project', format_message(ip.project)) + # Table 2 for row_index in range(xls.project_table_2_first_row, xls.project_table_2_last_row): - ip = IrcamProjects(sheet.cell_value(0, row_index)) - ip.set_external_id(sheet.cell_value(1, row_index)) - ip.set_call_project(sheet.cell_value(2, row_index)) - ip.set_date_from(xlrd.xldate.xldate_as_datetime(sheet.cell_value(4, row_index), 1)) - ip.set_date_to(xlrd.xldate.xldate_as_datetime(sheet.cell_value(5, row_index), 1)) - ip.set_lead_organization(sheet.cell_value(6, row_index)) - ip.set_referring_person(sheet.cell_value(7, row_index)) - ip.set_teams(sheet.cell_value(8, row_index)) - ip.set_manager(sheet.cell_value(9, row_index)) + ip = IrcamProjects(xls.sheet.cell_value(row_index, 0)) + ip.set_external_id(xls.sheet.cell_value(row_index, 1)) + ip.set_call_project(xls.sheet.cell_value(row_index, 2)) + ip.set_date_from(xlrd.xldate.xldate_as_datetime(xls.sheet.cell_value(row_index, 4), 1)) + ip.set_date_to(xlrd.xldate.xldate_as_datetime(xls.sheet.cell_value(row_index, 5), 1)) + ip.set_lead_organization(xls.sheet.cell_value(row_index, 6)) + ip.set_referring_person(xls.sheet.cell_value(row_index, 7)) + ip.set_teams(xls.sheet.cell_value(row_index, 8)) + ip.set_manager(xls.sheet.cell_value(row_index, 9)) ip.save_project() + + self.logger.info('Project', format_message(ip.project)) -- 2.39.5