forked from uncloud/uncloud
Switch to FormView for displaying the order
This commit is contained in:
parent
e910556952
commit
686d2c2b1e
5 changed files with 99 additions and 30 deletions
|
@ -36,6 +36,11 @@ machine. Use `kubectl get nodes` to verify minikube is up and running.
|
|||
* resources should have a slug
|
||||
* can be used as an identifier and non unique names
|
||||
|
||||
#### 3.1 (validation release, planned)
|
||||
|
||||
* Ensure that one resource cannot have multiple price_per_timeframe of
|
||||
the same timeframe
|
||||
|
||||
|
||||
#### 3.0.2 (planned)
|
||||
|
||||
|
@ -50,7 +55,7 @@ machine. Use `kubectl get nodes` to verify minikube is up and running.
|
|||
* Need to list resources [done]
|
||||
* Need to create manytomany relations for each resource resoluting
|
||||
in ResourceOrders1
|
||||
* Need to pass in the price for the selected timeframe
|
||||
* Need to pass in the price for the selected timeframe [done]
|
||||
* On submit
|
||||
* List of
|
||||
* resources + values
|
||||
|
|
13
uncloud_v3/app/forms.py
Normal file
13
uncloud_v3/app/forms.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
from django import forms
|
||||
|
||||
class ProductOrderForm(forms.Form):
|
||||
product = forms.SlugField(required=True)
|
||||
timeframe = forms.SlugField(required=True)
|
||||
|
||||
def __init__(self, resources, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
for res in resources:
|
||||
print(res)
|
||||
field_name = f"{res.name}"
|
||||
#field_name = f"resource_{res.slug}"
|
||||
self.fields[field_name] = forms.FloatField(required=True)
|
|
@ -74,14 +74,6 @@ class Resource(models.Model):
|
|||
|
||||
return f"{self.slug}: {minimum}-{maximum} (+/-){self.step_size} {self.unit} ({pricing})"
|
||||
|
||||
class ResourceOrder(models.Model):
|
||||
"""
|
||||
Resources that have been ordered
|
||||
"""
|
||||
timeframe = models.ForeignKey(TimeFrame, on_delete=models.CASCADE)
|
||||
value = models.FloatField()
|
||||
resource = models.ForeignKey(Resource, on_delete=models.CASCADE)
|
||||
|
||||
|
||||
class Product(models.Model):
|
||||
"""
|
||||
|
@ -118,6 +110,21 @@ class Product(models.Model):
|
|||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class ResourceOrder(models.Model):
|
||||
"""
|
||||
Resources that have been ordered
|
||||
The timeframe should be in the ProductOrder, as it needs to be consistent
|
||||
for all ordered resources
|
||||
|
||||
We need to record the selected value *and* potentially the
|
||||
calculated price
|
||||
|
||||
"""
|
||||
timeframe = models.ForeignKey(TimeFrame, on_delete=models.CASCADE)
|
||||
value = models.FloatField()
|
||||
resource = models.ForeignKey(Resource, on_delete=models.CASCADE)
|
||||
|
||||
|
||||
class ProductOrder(models.Model):
|
||||
"""
|
||||
Describes a product a user bought
|
||||
|
|
|
@ -1,9 +1,15 @@
|
|||
<h2>Ordering a {{ product }} instance for {{ timeframe }}</h2>
|
||||
|
||||
TODO: catch invalid timeframe
|
||||
|
||||
<form method="post" >
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ form }}
|
||||
</table>
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</form>
|
||||
|
||||
|
||||
<!--
|
||||
<div class="form-group">
|
||||
<label for="product">Product</label>
|
||||
<input type="text" class="form-control"
|
||||
|
@ -18,7 +24,7 @@ TODO: catch invalid timeframe
|
|||
{% for res,price,currency in res_price %}
|
||||
<div class="form-group">
|
||||
<label for="{{res.slug}}">{{res.name}} {{res.unit}}
|
||||
{{ price }}{{ currency.short_name }}/unit/{{ timeframe}}
|
||||
{{ price }}{{ currency.short_name }} per {{ timeframe}} per unit
|
||||
{% if res.minimum_units %} (Min: {{res.minimum_units}}) {%endif%}
|
||||
{% if res.maximum_units %} (Max: {{res.maximum_units}}) {%endif%}
|
||||
</label>
|
||||
|
@ -27,5 +33,4 @@ TODO: catch invalid timeframe
|
|||
</div>
|
||||
{% endfor %}
|
||||
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</form>
|
||||
-->
|
||||
|
|
|
@ -1,35 +1,74 @@
|
|||
from django.shortcuts import render, get_object_or_404
|
||||
from django.urls import reverse
|
||||
|
||||
from django.views.generic.edit import CreateView
|
||||
from django.views.generic.edit import CreateView, FormView
|
||||
from django.views.generic.base import TemplateView
|
||||
from django.views.generic.list import ListView
|
||||
from django.views.generic.detail import DetailView
|
||||
|
||||
|
||||
from .models import *
|
||||
from django.http import HttpResponse
|
||||
|
||||
class ProductOrderView(CreateView):
|
||||
model = ProductOrder
|
||||
fields = ['resources']
|
||||
from .models import *
|
||||
from .forms import *
|
||||
|
||||
#class ProductOrderView(CreateView):
|
||||
class ProductOrderView(FormView):
|
||||
form_class = ProductOrderForm
|
||||
template_name = 'app/productorder_form.html'
|
||||
success_url = '/'
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super().get_form_kwargs()
|
||||
# print(self)
|
||||
# print(self.request)
|
||||
print(self.kwargs)
|
||||
#context = self.get_context_data(**kwargs)
|
||||
#kwargs['resources'] = self.request['object'].resources.all()
|
||||
product = get_object_or_404(Product, slug=self.kwargs['product'])
|
||||
kwargs['resources'] = product.resources.all()
|
||||
return kwargs
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['product'] = get_object_or_404(Product, slug=self.kwargs['product'])
|
||||
context['timeframe'] = get_object_or_404(TimeFrame, slug=self.kwargs['timeframe'])
|
||||
|
||||
res_price = []
|
||||
for res in context['product'].resources.all():
|
||||
price = res.price_per_time.filter(timeframe=context['timeframe'])[0].price
|
||||
currency = res.price_per_time.filter(timeframe=context['timeframe'])[0].currency
|
||||
|
||||
res_price.append((res, price, currency))
|
||||
context['res_price'] = res_price
|
||||
|
||||
print(context)
|
||||
print(self.kwargs)
|
||||
# context['form'] = ProductOrderForm(
|
||||
# context['product'].resources.all(),
|
||||
# initial={'product': context['product'].slug,
|
||||
# 'timeframe': context['timeframe'].slug}
|
||||
# )
|
||||
return context
|
||||
|
||||
# v2
|
||||
# def post(self, request, *args, **kwargs):
|
||||
# context = self.get_context_data()
|
||||
# if context["form"].is_valid():
|
||||
# print("form good")
|
||||
# else:
|
||||
# print("form not good")
|
||||
# print(context["form"].errors)
|
||||
# return HttpResponse("All good")
|
||||
|
||||
|
||||
# v1
|
||||
# def get_context_data(self, **kwargs):
|
||||
# context = super().get_context_data(**kwargs)
|
||||
# context['product'] = get_object_or_404(Product, slug=self.kwargs['product'])
|
||||
# context['timeframe'] = get_object_or_404(TimeFrame, slug=self.kwargs['timeframe'])
|
||||
|
||||
# res_price = []
|
||||
# for res in context['product'].resources.all():
|
||||
# price = res.price_per_time.filter(timeframe=context['timeframe'])[0].price
|
||||
# currency = res.price_per_time.filter(timeframe=context['timeframe'])[0].currency
|
||||
|
||||
# res_price.append((res, price, currency))
|
||||
# context['res_price'] = res_price
|
||||
|
||||
# print(context)
|
||||
# print(self.kwargs)
|
||||
# return context
|
||||
|
||||
|
||||
class ProductDetailView(DetailView):
|
||||
model = Product
|
||||
|
|
Loading…
Reference in a new issue