rattail-harvest/rattail_harvest/importing/model.py

110 lines
3.7 KiB
Python
Raw Normal View History

# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
# Rattail is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
rattail-harvest model importers
"""
import logging
from rattail.importing.model import ToRattail
from rattail_harvest.db import model
log = logging.getLogger(__name__)
##############################
# harvest cache models
##############################
class HarvestUserImporter(ToRattail):
model_class = model.HarvestUser
class HarvestClientImporter(ToRattail):
model_class = model.HarvestClient
class HarvestProjectImporter(ToRattail):
model_class = model.HarvestProject
class HarvestTaskImporter(ToRattail):
model_class = model.HarvestTask
class HarvestTimeEntryImporter(ToRattail):
model_class = model.HarvestTimeEntry
# flags to auto-create records for "unknown" references
auto_create_unknown_project = True
# flags to log warning vs. debug for "unknown" references
warn_for_unknown_project = True
def setup(self):
super(HarvestTimeEntryImporter, self).setup()
model = self.model
if 'project_id' in self.fields:
self.harvest_projects_by_id = self.app.cache_model(
self.session, model.HarvestProject, key='id')
def cache_query(self):
query = super().cache_query()
if self.start_date:
query = query.filter(self.model_class.spent_date >= self.start_date)
if self.end_date:
query = query.filter(self.model_class.spent_date <= self.end_date)
return query
def get_harvest_project(self, project_id):
if hasattr(self, 'harvest_projects_by_id'):
return self.harvest_projects_by_id.get(project_id)
model = self.model
return self.session.query(model.HarvestProject)\
.filter(model.HarvestProject.id == project_id)\
.first()
def update_object(self, entry, data, local_data=None):
entry = super(HarvestTimeEntryImporter, self).update_object(entry, data, local_data)
model = self.model
if 'project_id' in self.fields:
project_id = data['project_id']
project = self.get_harvest_project(project_id)
if not project:
logger = log.warning if self.warn_for_unknown_project else log.debug
logger("unknown project id %s for time entry id %s: %s",
project_id, entry.id, entry)
if self.auto_create_unknown_project:
project = model.HarvestProject()
project.id = project_id
project.name = "(unknown)"
self.session.add(project)
if hasattr(self, 'harvest_projects_by_id'):
self.harvest_projects_by_id[project_id] = project
elif entry.project_id:
entry.project_id = None
return entry