def post(self, *args, **kwargs): self.parse_args() self.form = PricingGroupForm( self.date, self.request.POST, self.request.FILES, ) if self.form.is_valid(): self.form.save(commit=False) self.form.instance.date = datetime.date(self.year, self.month, 1) self.form.instance.save() if self.form.cleaned_data['clone']: sources = PricingGroup.objects.filter( name=self.form.instance.name, date__lt=self.form.instance.date, ).order_by('-date')[:1] if sources.exists(): self.form.instance.clone_contents(sources[0]) elif self.form.cleaned_data['upload']: self.import_csv( self.form.instance, self.request.FILES['upload'] ) messages.success( self.request, "Group %s saved." % self.form.instance.name ) return HttpResponseRedirect(self.request.path) messages.error(self.request, "Errors in the form.") return self.get(*args, **kwargs)
def get_context_data(self, **kwargs): ret = super(CatalogPricingNew, self).get_context_data(**kwargs) self.parse_args() if self.form is None: self.form = PricingGroupForm(self.date) ret.update({ 'form': self.form, 'group_name': '', }) return ret
class CatalogPricingNew(CatalogPricing): def __init__(self, *args, **kwargs): super(CatalogPricingNew, self).__init__(*args, **kwargs) self.form = None def post(self, *args, **kwargs): self.parse_args() self.form = PricingGroupForm( self.date, self.request.POST, self.request.FILES, ) if self.form.is_valid(): self.form.save(commit=False) self.form.instance.date = datetime.date(self.year, self.month, 1) self.form.instance.save() if self.form.cleaned_data['clone']: sources = PricingGroup.objects.filter( name=self.form.instance.name, date__lt=self.form.instance.date, ).order_by('-date')[:1] if sources.exists(): self.form.instance.clone_contents(sources[0]) elif self.form.cleaned_data['upload']: self.import_csv( self.form.instance, self.request.FILES['upload'] ) messages.success( self.request, "Group %s saved." % self.form.instance.name ) return HttpResponseRedirect(self.request.path) messages.error(self.request, "Errors in the form.") return self.get(*args, **kwargs) @nested_commit_on_success def import_csv(self, group, uploaded_file): if uploaded_file.size > 4 * 1024 * 1024: messages.error(self.request, "File too big to import.") return f = cStringIO.StringIO(uploaded_file.read()) rows = iter(csvutil.UnicodeReader(f)) header = list(rows.next()) if header[0].strip() != 'sn': messages.error( self.request, "The first row should have 'sn' followed by variable names." ) return variables = [name.strip() for name in header[1:]] devices = {} try: for row in rows: if not row: continue devices[row[0]] = dict(zip( variables, (decimal.Decimal(v) for v in row[1:]), )) except ValueError as e: messages.error(self.request, "Invalid value: %s." % e) return variable_dict = {} for name in variables: v = PricingVariable(name=name, group=group) v.save() variable_dict[name] = v for sn, values in devices.iteritems(): try: device = Device.objects.get(sn=sn) except Device.DoesNotExist: messages.warning( self.request, "Serial number %s not found, skipping." % sn ) continue group.devices.add(device) for name, value in values.iteritems(): PricingValue( variable=variable_dict[name], device=device, value=value, ).save() group.save() def get_context_data(self, **kwargs): ret = super(CatalogPricingNew, self).get_context_data(**kwargs) self.parse_args() if self.form is None: self.form = PricingGroupForm(self.date) ret.update({ 'form': self.form, 'group_name': '', }) return ret
class CatalogPricingNew(CatalogPricing): def __init__(self, *args, **kwargs): super(CatalogPricingNew, self).__init__(*args, **kwargs) self.form = None def post(self, *args, **kwargs): self.parse_args() self.form = PricingGroupForm( self.date, self.request.POST, self.request.FILES, ) if self.form.is_valid(): self.form.save(commit=False) self.form.instance.date = datetime.date(self.year, self.month, 1) self.form.instance.save() if self.form.cleaned_data['clone']: sources = PricingGroup.objects.filter( name=self.form.instance.name, date__lt=self.form.instance.date, ).order_by('-date')[:1] if sources.exists(): self.form.instance.clone_contents(sources[0]) elif self.form.cleaned_data['upload']: self.import_csv( self.form.instance, self.request.FILES['upload'] ) messages.success( self.request, "Group %s saved." % self.form.instance.name ) return HttpResponseRedirect(self.request.path) messages.error(self.request, "Errors in the form.") return self.get(*args, **kwargs) @nested_commit_on_success def import_csv(self, group, uploaded_file): if uploaded_file.size > 4 * 1024 * 1024: messages.error(self.request, "File too big to import.") return f = cStringIO.StringIO(uploaded_file.read()) rows = iter(UnicodeReader(f)) header = list(rows.next()) if header[0].strip() != 'sn': messages.error( self.request, "The first row should have 'sn' followed by variable names." ) return variables = [name.strip() for name in header[1:]] devices = {} try: for row in rows: if not row: continue devices[row[0]] = dict(zip( variables, (decimal.Decimal(v) for v in row[1:]), )) except ValueError as e: messages.error(self.request, "Invalid value: %s." % e) return variable_dict = {} for name in variables: v = PricingVariable(name=name, group=group) v.save() variable_dict[name] = v for sn, values in devices.iteritems(): try: device = Device.objects.get(sn=sn) except Device.DoesNotExist: messages.warning( self.request, "Serial number %s not found, skipping." % sn ) continue group.devices.add(device) for name, value in values.iteritems(): PricingValue( variable=variable_dict[name], device=device, value=value, ).save() group.save() def get_context_data(self, **kwargs): ret = super(CatalogPricingNew, self).get_context_data(**kwargs) self.parse_args() if self.form is None: self.form = PricingGroupForm(self.date) ret.update({ 'form': self.form, 'group_name': '', }) return ret