コード例 #1
0
 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)
コード例 #2
0
 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
コード例 #3
0
ファイル: catalog.py プロジェクト: damjanek/ralph
 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)
コード例 #4
0
ファイル: catalog.py プロジェクト: damjanek/ralph
 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
コード例 #5
0
ファイル: catalog.py プロジェクト: damjanek/ralph
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
コード例 #6
0
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