Skip to content
Snippets Groups Projects
Commit 0a3b82c4 authored by Piotr Gawron's avatar Piotr Gawron
Browse files

etl model data extracted to abstract model class

parent 7c08b714
No related branches found
No related tags found
1 merge request!275Resolve "update automatic visit/subject importer"
# Generated by Django 2.0.13 on 2020-11-17 07:22 # Generated by Django 2.0.13 on 2020-11-18 10:51
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
...@@ -12,18 +12,41 @@ class Migration(migrations.Migration): ...@@ -12,18 +12,41 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='VisitImportData', name='EtlData',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('filename', models.CharField(blank=True, default='', max_length=128, verbose_name='File used for automatic import')),
('run_at_times', models.CharField(blank=True, default='', max_length=1024, verbose_name='At what time automatic import should run')),
],
),
migrations.CreateModel(
name='VisitImportData',
fields=[
('etldata_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='web.EtlData')),
('subject_id_column_name', models.CharField(default='donor_id', max_length=128, verbose_name='Subject id column name')),
('visit_date_column_name', models.CharField(default='dateofvisit', max_length=128, verbose_name='Visit date column name')),
('location_column_name', models.CharField(default='adressofvisit', max_length=128, verbose_name='Location column name')),
('visit_number_column_name', models.CharField(default='visit_id', max_length=128, verbose_name='Visit number column name')),
('appointment_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.AppointmentType', verbose_name='Default appointment type')), ('appointment_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.AppointmentType', verbose_name='Default appointment type')),
('import_worker', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.Worker', verbose_name='Worker used by importer')),
('study', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='web.Study', verbose_name='Study')),
('subject_id_column_name', models.CharField(blank=False, default='donor_id', max_length=128, null=False,verbose_name='Subject id column name')),
('visit_date_column_name', models.CharField(blank=False, default='dateofvisit', max_length=128, null=False,verbose_name='Visit date column name')),
('location_column_name', models.CharField(blank=False, default='adressofvisit', max_length=128, null=False,verbose_name='Location column name')),
('visit_number_column_name', models.CharField(blank=False, default='visit_id', max_length=128, null=False,verbose_name='Visit number column name')),
('filename', models.CharField(blank=True, default='', max_length=128, null=False, verbose_name='File used for automatic import')),
('run_at_times', models.CharField(blank=True, default='', max_length=1024, null=False, verbose_name='At what time automatic import should run')),
], ],
bases=('web.etldata',),
),
migrations.AddField(
model_name='etldata',
name='import_worker',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.Worker', verbose_name='Worker used by importer'),
), ),
migrations.AddField(
model_name='etldata',
name='study',
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='web.Study', verbose_name='Study'),
),
migrations.CreateModel(
name='SubjectImportData',
fields=[
('etldata_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='web.EtlData')),
],
bases=('web.etldata',),
),
] ]
...@@ -39,7 +39,7 @@ from .mail_template import MailTemplate ...@@ -39,7 +39,7 @@ from .mail_template import MailTemplate
from .missing_subject import MissingSubject from .missing_subject import MissingSubject
from .inconsistent_subject import InconsistentSubject, InconsistentField from .inconsistent_subject import InconsistentSubject, InconsistentField
from .etl import VisitImportData from .etl import VisitImportData, SubjectImportData
__all__ = [Study, FlyingTeam, Appointment, AppointmentType, Availability, Holiday, Item, Language, Location, Room, __all__ = [Study, FlyingTeam, Appointment, AppointmentType, Availability, Holiday, Item, Language, Location, Room,
Subject, StudySubject, StudySubjectList, SubjectColumns, StudyNotificationParameters, Subject, StudySubject, StudySubjectList, SubjectColumns, StudyNotificationParameters,
......
from .visit_import import VisitImportData from .visit_import import VisitImportData
from .subject_import import SubjectImportData
__all__ = [VisitImportData] __all__ = [VisitImportData, SubjectImportData]
# coding=utf-8
import logging
import os
from django.conf import settings
from django.db import models
logger = logging.getLogger(__name__)
class EtlData(models.Model):
study = models.ForeignKey("web.Study",
verbose_name='Study',
editable=False,
null=False,
on_delete=models.CASCADE
)
import_worker = models.ForeignKey("web.Worker",
verbose_name='Worker used by importer',
blank=True,
null=True,
on_delete=models.CASCADE
)
filename = models.CharField(max_length=128,
verbose_name='File used for automatic import',
default='',
null=False,
blank=True
)
run_at_times = models.CharField(max_length=1024,
verbose_name='At what time automatic import should run',
default='',
null=False,
blank=True
)
def file_available(self) -> bool:
if self.filename is None or self.filename == '':
return False
absolute_path = self.get_absolute_file_path()
if os.path.basename(absolute_path) != self.filename:
logger.warning('File "{}" outside defined ETL_ROOT: {}'.format(self.filename, settings.ETL_ROOT))
return False
return os.path.isfile(absolute_path)
def get_absolute_file_path(self) -> str:
return os.path.join(settings.ETL_ROOT, self.filename)
# coding=utf-8
import logging
from web.models.etl.etl import EtlData
logger = logging.getLogger(__name__)
class SubjectImportData(EtlData):
pass
# coding=utf-8 # coding=utf-8
import logging import logging
import os
from django.conf import settings
from django.db import models from django.db import models
logger = logging.getLogger(__name__) from web.models.etl.etl import EtlData
logger = logging.getLogger(__name__)
class VisitImportData(models.Model):
study = models.ForeignKey("web.Study",
verbose_name='Study',
editable=False,
null=False,
on_delete=models.CASCADE
)
class VisitImportData(EtlData):
appointment_type = models.ForeignKey("web.AppointmentType", appointment_type = models.ForeignKey("web.AppointmentType",
verbose_name='Default appointment type', verbose_name='Default appointment type',
blank=True, blank=True,
...@@ -23,13 +16,6 @@ class VisitImportData(models.Model): ...@@ -23,13 +16,6 @@ class VisitImportData(models.Model):
on_delete=models.CASCADE on_delete=models.CASCADE
) )
import_worker = models.ForeignKey("web.Worker",
verbose_name='Worker used by importer',
blank=True,
null=True,
on_delete=models.CASCADE
)
subject_id_column_name = models.CharField(max_length=128, subject_id_column_name = models.CharField(max_length=128,
verbose_name='Subject id column name', verbose_name='Subject id column name',
default='donor_id', default='donor_id',
...@@ -43,39 +29,17 @@ class VisitImportData(models.Model): ...@@ -43,39 +29,17 @@ class VisitImportData(models.Model):
null=False, null=False,
blank=False blank=False
) )
location_column_name = models.CharField(max_length=128, location_column_name = models.CharField(max_length=128,
verbose_name='Location column name', verbose_name='Location column name',
default='adressofvisit', default='adressofvisit',
null=False, null=False,
blank=False blank=False
) )
visit_number_column_name = models.CharField(max_length=128, visit_number_column_name = models.CharField(max_length=128,
verbose_name='Visit number column name', verbose_name='Visit number column name',
default='visit_id', default='visit_id',
null=False, null=False,
blank=False blank=False
) )
filename = models.CharField(max_length=128,
verbose_name='File used for automatic import',
default='',
null=False,
blank=True
)
run_at_times = models.CharField(max_length=1024,
verbose_name='At what time automatic import should run',
default='',
null=False,
blank=True
)
def file_available(self):
if self.filename is None or self.filename == '':
return False
absolute_path = self.get_absolute_file_path()
if os.path.basename(absolute_path) != self.filename:
logger.warning('File "{}" outside defined ETL_ROOT: {}'.format(self.filename, settings.ETL_ROOT))
return False
return os.path.isfile(absolute_path)
def get_absolute_file_path(self) -> str:
return os.path.join(settings.ETL_ROOT, self.filename)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment