Skip to content

Commit

Permalink
Merge pull request #89 from eea/data_clone
Browse files Browse the repository at this point in the history
Data clone
  • Loading branch information
dianaboiangiu committed Apr 4, 2018
2 parents e82266f + 4aa968c commit 222d089
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 6 deletions.
37 changes: 37 additions & 0 deletions insitu/forms.py
Expand Up @@ -273,6 +273,37 @@ class Meta:
'quality_control_procedure', 'dissemination',
'inspire_themes', 'essential_variables']

def save(self, created_by='', commit=True):
if created_by:
self.instance.created_by = created_by
else:
created_by = self.instance.created_by
inspire_themes = self.cleaned_data.pop('inspire_themes')
essential_variables = self.cleaned_data.pop('essential_variables')
if not self.initial:
data = models.Data.objects.create(created_by=created_by,
**self.cleaned_data)

else:
data = models.Data.objects.filter(pk=self.instance.pk)
data.update(created_by=created_by, **self.cleaned_data)
data = data.first()
for inspire_theme in data.inspire_themes.all():
data.inspire_themes.remove(inspire_theme)
for essential_variable in data.essential_variables.all():
data.essential_variables.remove(essential_variable)

for inspire_theme in inspire_themes:
data.inspire_themes.add(inspire_theme.id)
for essential_variable in essential_variables:
data.essential_variables.add(essential_variable.id)
return data

class DataCloneForm(DataForm):
def save(self, created_by='', commit=True):
self.initial = None
return super(DataCloneForm, self).save(created_by, commit)


class DataReadyForm(RequiredFieldsMixin, DataForm):
class Meta:
Expand All @@ -297,6 +328,12 @@ def clean(self):
self.add_error("essential_variables", error)


class DataReadyCloneForm(DataReadyForm):
def save(self, created_by='', commit=True):
self.initial = None
return super(DataReadyCloneForm, self).save(created_by, commit)


class DataRequirementBaseForm(forms.ModelForm):
requirement = forms.ModelChoiceField(
disabled=True,
Expand Down
10 changes: 6 additions & 4 deletions insitu/templates/data/add.html
Expand Up @@ -30,11 +30,11 @@ <h1 class="col-sm-12">
</div>
{% if ready_form %}
<div class="alert alert-warning">
This form has mandatory fields! If you want to access a draft version click <a href="{% url 'data:add' %}">here</a>.
This form has mandatory fields! If you want to access a draft version click <a href="{% url 'data:add' %}?pk={{ request.GET.pk }}">here</a>.
</div>
{% else %}
<div class="alert alert-danger">
This form has no mandatory fields! You can access the form with required validation <a href="{% url 'data:add' %}?ready">here</a>.
This form has no mandatory fields! You can access the form with required validation <a href="{% url 'data:add' %}?ready&pk={{ request.GET.pk }}">here</a>.
</div>
{% endif %}
<form action="" method="POST">
Expand All @@ -54,10 +54,12 @@ <h1 class="col-sm-12">
</label>
<div class="input-group input-daterange">
<input type="text" class="input-sm form-control" name="start_time_coverage"
id="id_start_time_coverage" data-provide="datepicker"/>
id="id_start_time_coverage" data-provide="datepicker"
value="{{ form.start_time_coverage.value|date:'m/d/Y'}}"/>
<span class="input-group-addon">to</span>
<input type="text" class="input-sm form-control" name="end_time_coverage"
id="id_end_time_coverage" data-provide="datepicker"/>
id="id_end_time_coverage" data-provide="datepicker"
value="{{ form.end_time_coverage.value|date:'m/d/Y'}}"/>
<div class="input-group-addon">
<span class="glyphicon glyphicon-th"></span>
</div>
Expand Down
7 changes: 7 additions & 0 deletions insitu/templates/data/detail.html
Expand Up @@ -33,6 +33,13 @@ <h1 class="col-sm-12">
</span>
{% endif %}
{% endif %}
<br>
<span class="pull-right">
<a class="btn btn-primary pull-right"
href="{% url 'data:add' %}?pk={{ data.pk }}">
Clone data
</a>
</span>
</h1>
</div>

Expand Down
56 changes: 56 additions & 0 deletions insitu/tests/test_data.py
Expand Up @@ -63,6 +63,28 @@ def setUp(self):
base.TeamFactory(user=self.creator)
self.client.force_login(self.creator)

def _create_clone_data(self, data):
inspire_themes = [base.InspireThemeFactory(),
base.InspireThemeFactory()]
DATA_FOR_CLONE = {
'name': data.name,
'note': 'TEST note',
'dissemination': data.dissemination.pk,
'update_frequency': data.update_frequency.pk,
'area': data.area.pk,
'timeliness': data.timeliness.pk,
'data_policy': data.data_policy.pk,
'data_type': data.data_type.pk,
'data_format': data.data_format.pk,
'start_time_coverage': datetime.date(day=1, month=1, year=2000),
'end_time_coverage': datetime.date(day=1, month=1, year=2000),
'quality_control_procedure': data.quality_control_procedure.pk,
'inspire_themes': [inspire_theme.pk for inspire_theme
in inspire_themes],
'essential_variables': [],
}
return DATA_FOR_CLONE

def test_list_data_json(self):
base.DataFactory(created_by=self.creator)
resp = self.client.get(reverse('data:json'))
Expand Down Expand Up @@ -141,6 +163,40 @@ def test_add_data_either_essential_variable_or_inspire_theme_required(self):
self.check_object(models.Data.objects.last(), data)
self.logging()

def test_get_add_with_clone(self):
self.erase_logging_file()
data = base.DataFactory(created_by=self.creator)
resp = self.client.get(reverse('data:add') + '?ready&pk=' + str(data.pk),
{})
self.assertEqual(resp.status_code, 200)
form_data = [ value for field, value in resp.context['form'].initial.items()]
self.assertTrue(form_data)
self.logging()

def test_post_add_with_clone_ready_errors(self):
data = base.DataFactory(created_by=self.creator)
self._create_clone_data(data)
resp = self.client.post(reverse('data:add') + '?ready&pk=' + str(data.pk),
{})
self.assertEqual(resp.status_code, 200)
self.check_required_errors(resp, self.errors)

def test_post_add_with_clone_ready(self):
data = base.DataFactory(created_by=self.creator)
cloned_data = self._create_clone_data(data)
resp = self.client.post(reverse('data:add') + '?ready&pk=' + str(data.pk),
cloned_data)
self.assertEqual(resp.status_code, 302)
self.check_object(models.Data.objects.last(), cloned_data)

def test_post_add_clone_without_ready(self):
data = base.DataFactory(created_by=self.creator)
cloned_data = self._create_clone_data(data)
resp = self.client.post(reverse('data:add') + '?pk=' + str(data.pk),
cloned_data)
self.assertEqual(resp.status_code, 302)
self.check_object(models.Data.objects.last(), cloned_data)

def test_detail_data(self):
self.erase_logging_file()
data = base.DataFactory(created_by=self.creator)
Expand Down
48 changes: 46 additions & 2 deletions insitu/views/data.py
Expand Up @@ -14,7 +14,6 @@
from insitu.views.protected.permissions import IsDraftObject
from picklists import models as pickmodels


class DataList(LoggingProtectedTemplateView):
template_name = 'data/list.html'
permission_classes = (IsAuthenticated, )
Expand Down Expand Up @@ -75,14 +74,59 @@ class DataAdd(CreatedByMixin, LoggingProtectedCreateView):
permission_denied_redirect = reverse_lazy('data:list')
target_type = 'data'

def get_data(self):
try:
return self.get_object()
except AttributeError:
pk = self.request.GET.get('pk', None)
try:
return models.Data.objects.get(pk=pk)
except ObjectDoesNotExist:
return

def get_initial(self):
data = None
try:
data = self.get_data()
except:
pass
if not data:
return super().get_initial()

initial_data = super().get_initial()
for field in ['name', 'note', 'update_frequency',
'area', 'start_time_coverage', 'end_time_coverage',
'timeliness', 'data_policy', 'data_type',
'data_format', 'quality_control_procedure',
'dissemination']:
initial_data[field] = getattr(data, field)
initial_data['inspire_themes'] = getattr(data, 'inspire_themes').all()
initial_data['essential_variables'] = getattr(data, 'essential_variables').all()
return initial_data.copy()

def get_form_class(self):
data = None
try:
data = self.get_data()
except:
pass
if data:
self.post_action = 'cloned data {pk} to'.format(
pk=data.pk)
self.post_action_failed = 'tried to clone data {pk} of'.format(
pk=data.pk
)

if 'ready' in self.request.GET:
return forms.DataReadyCloneForm
return forms.DataCloneForm
if 'ready' in self.request.GET:
return forms.DataReadyForm
return forms.DataForm

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.get_form_class() == forms.DataReadyForm:
if self.get_form_class() == forms.DataReadyForm or self.get_form_class() == forms.DataReadyCloneForm:
context['ready_form'] = True
return context

Expand Down

0 comments on commit 222d089

Please sign in to comment.