Add button to re-import Harvest cache time entry from API

This commit is contained in:
Lance Edgar 2023-10-04 13:10:28 -05:00
parent a1c9199416
commit f388f2d6cf
2 changed files with 92 additions and 1 deletions

View file

@ -0,0 +1,45 @@
## -*- coding: utf-8; -*-
<%inherit file="/master/view.mako" />
<%def name="object_helpers()">
${parent.object_helpers()}
${self.render_import_helper()}
</%def>
<%def name="render_import_helper()">
% if master.has_perm('import_from_harvest'):
<nav class="panel">
<p class="panel-heading">Re-Import</p>
<div class="panel-block buttons">
<div style="display: flex; flex-direction: column;">
% if master.has_perm('import_from_harvest'):
${h.form(master.get_action_url('import_from_harvest', instance), **{'@submit': 'importFromHarvestSubmitting = true'})}
${h.csrf_token(request)}
<b-button type="is-primary"
native-type="submit"
icon-pack="fas"
icon-left="redo"
:disabled="importFromHarvestSubmitting">
{{ importFromHarvestSubmitting ? "Working, please wait..." : "Re-Import from Harvest" }}
</b-button>
${h.end_form()}
% endif
</div>
</div>
</nav>
% endif
</%def>
<%def name="modify_this_page_vars()">
${parent.modify_this_page_vars()}
% if master.has_perm('import_from_harvest'):
<script type="text/javascript">
ThisPageData.importFromHarvestSubmitting = false
</script>
% endif
</%def>
${parent.body()}

View file

@ -62,7 +62,7 @@ class HarvestTimeEntryView(HarvestMasterView):
g.set_link('notes') g.set_link('notes')
def configure_form(self, f): def configure_form(self, f):
super(HarvestTimeEntryView, self).configure_form(f) super().configure_form(f)
# make sure id is first field # make sure id is first field
f.remove('id') f.remove('id')
@ -84,11 +84,20 @@ class HarvestTimeEntryView(HarvestMasterView):
f.remove('task_id') f.remove('task_id')
f.set_renderer('task', self.render_harvest_task) f.set_renderer('task', self.render_harvest_task)
# hours
f.set_renderer('hours', self.render_hours)
f.set_type('notes', 'text') f.set_type('notes', 'text')
f.set_type('billable_rate', 'currency') f.set_type('billable_rate', 'currency')
f.set_type('cost_rate', 'currency') f.set_type('cost_rate', 'currency')
def render_hours(self, entry, field):
hours = getattr(entry, field)
app = self.get_rattail_app()
duration = app.render_duration(hours=hours)
return f"{hours} ({duration})"
def get_xref_buttons(self, entry): def get_xref_buttons(self, entry):
buttons = super(HarvestTimeEntryView, self).get_xref_buttons(entry) buttons = super(HarvestTimeEntryView, self).get_xref_buttons(entry)
model = self.model model = self.model
@ -105,6 +114,43 @@ class HarvestTimeEntryView(HarvestMasterView):
return buttons return buttons
def import_from_harvest(self):
app = self.get_rattail_app()
handler = app.get_import_handler('to_rattail.from_harvest.import', require=True)
importer = handler.get_importer('HarvestTimeEntry')
importer.session = self.Session()
importer.setup()
cache_entry = self.get_instance()
if self.oneoff_import(importer, local_object=cache_entry):
self.request.session.flash(f"{self.get_model_title()} has been "
f"(re-)imported from Harvest: {cache_entry}")
else:
self.request.session.flash("Import failed!", 'error')
return self.redirect(self.get_action_url('view', cache_entry))
@classmethod
def defaults(cls, config):
route_prefix = cls.get_route_prefix()
instance_url_prefix = cls.get_instance_url_prefix()
permission_prefix = cls.get_permission_prefix()
model_title = cls.get_model_title()
# normal defaults
cls._defaults(config)
# import from harvest
config.add_tailbone_permission(permission_prefix,
f'{permission_prefix}.import_from_harvest',
f"Re-Import {model_title} from Harvest")
config.add_route(f'{route_prefix}.import_from_harvest',
f'{instance_url_prefix}/import-from-harvest',
request_method='POST')
config.add_view(cls, attr='import_from_harvest',
route_name=f'{route_prefix}.import_from_harvest',
permission=f'{permission_prefix}.import_from_harvest')
def defaults(config, **kwargs): def defaults(config, **kwargs):
base = globals() base = globals()