Merge branch 'cart' into andreas
This commit is contained in:
commit
711e73a8b2
|
@ -8,7 +8,7 @@ class RegistrationForm(forms.Form):
|
||||||
first_name = forms.CharField()
|
first_name = forms.CharField()
|
||||||
last_name = forms.CharField()
|
last_name = forms.CharField()
|
||||||
street_name = forms.CharField()
|
street_name = forms.CharField()
|
||||||
street_number = forms.CharField()
|
street_number = forms.CharField(max_length=4)
|
||||||
zip_code = forms.IntegerField(min_value=1000, max_value=9999)
|
zip_code = forms.IntegerField(min_value=1000, max_value=9999)
|
||||||
city = forms.CharField()
|
city = forms.CharField()
|
||||||
|
|
||||||
|
@ -51,3 +51,10 @@ class PictureForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Picture
|
model = Picture
|
||||||
fields = ['name', 'article', 'image']
|
fields = ['name', 'article', 'image']
|
||||||
|
|
||||||
|
|
||||||
|
class AddToCartForm(forms.Form):
|
||||||
|
amount = forms.IntegerField(
|
||||||
|
label='Amount in piece.',
|
||||||
|
help_text="Enter a Value between 1 and 99.",
|
||||||
|
initial=1)
|
||||||
|
|
|
@ -3,6 +3,7 @@ from django.core.validators import MinValueValidator
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from currencies.models import ExchangeRate
|
||||||
|
|
||||||
|
|
||||||
class Option(models.Model):
|
class Option(models.Model):
|
||||||
|
@ -22,7 +23,6 @@ class ArticleStatus(models.Model):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
# Create your models here.
|
|
||||||
class Category(models.Model):
|
class Category(models.Model):
|
||||||
name = models.CharField(max_length=200, unique=True)
|
name = models.CharField(max_length=200, unique=True)
|
||||||
parent_category = models.ForeignKey('self', null=True, blank=True)
|
parent_category = models.ForeignKey('self', null=True, blank=True)
|
||||||
|
@ -50,6 +50,7 @@ class Article(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class OrderStatus(models.Model):
|
class OrderStatus(models.Model):
|
||||||
|
""" Warehouse Items have Status like ordered or out of Stock """
|
||||||
name = models.CharField(max_length=200, unique=True)
|
name = models.CharField(max_length=200, unique=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
@ -57,6 +58,7 @@ class OrderStatus(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class OrderOfGoods(models.Model):
|
class OrderOfGoods(models.Model):
|
||||||
|
""" Warehouse operations """
|
||||||
article = models.ForeignKey(Article)
|
article = models.ForeignKey(Article)
|
||||||
amount = models.FloatField(max_length=5)
|
amount = models.FloatField(max_length=5)
|
||||||
delivery_date = models.DateField()
|
delivery_date = models.DateField()
|
||||||
|
@ -68,6 +70,7 @@ class OrderOfGoods(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Picture(models.Model):
|
class Picture(models.Model):
|
||||||
|
""" Pictures in relationship to Articles """
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
article = models.ForeignKey(Article)
|
article = models.ForeignKey(Article)
|
||||||
image = models.ImageField(upload_to="images")
|
image = models.ImageField(upload_to="images")
|
||||||
|
@ -77,13 +80,15 @@ class Picture(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Order(models.Model):
|
class Order(models.Model):
|
||||||
|
""" Submitted Orders """
|
||||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
article = models.ManyToManyField(Article, through='OrderPosition')
|
|
||||||
status = models.ForeignKey(OrderStatus)
|
status = models.ForeignKey(OrderStatus)
|
||||||
date = models.DateTimeField(default=timezone.now)
|
date = models.DateTimeField(default=timezone.now)
|
||||||
|
exchange_rate = models.ForeignKey(ExchangeRate)
|
||||||
|
|
||||||
|
|
||||||
class OrderPosition(models.Model):
|
class OrderPosition(models.Model):
|
||||||
|
""" Items in Submitted Orders"""
|
||||||
article = models.ForeignKey(Article, on_delete=models.CASCADE)
|
article = models.ForeignKey(Article, on_delete=models.CASCADE)
|
||||||
order = models.ForeignKey(Order, on_delete=models.CASCADE)
|
order = models.ForeignKey(Order, on_delete=models.CASCADE)
|
||||||
amount = models.FloatField(max_length=5)
|
amount = models.FloatField(max_length=5)
|
||||||
|
@ -94,14 +99,21 @@ class OrderPosition(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class ShoppingCart(models.Model):
|
class ShoppingCart(models.Model):
|
||||||
name = models.CharField(max_length=200)
|
""" Cart to User Relationships """
|
||||||
|
name = models.CharField(max_length=200, null=True)
|
||||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
article = models.ManyToManyField(Article)
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class CartPosition(models.Model):
|
||||||
|
""" Items in Cart """
|
||||||
|
article = models.ForeignKey(Article, on_delete=models.CASCADE)
|
||||||
|
amount = models.FloatField(max_length=5)
|
||||||
|
cart = models.ForeignKey(ShoppingCart, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|
||||||
class City(models.Model):
|
class City(models.Model):
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
zip_code = models.PositiveSmallIntegerField()
|
zip_code = models.PositiveSmallIntegerField()
|
||||||
|
|
|
@ -6,6 +6,15 @@
|
||||||
<p><b>Stock:</b> {{ article.stock }}</p>
|
<p><b>Stock:</b> {{ article.stock }}</p>
|
||||||
<p><b>Status:</b> {{ article.status }}</p>
|
<p><b>Status:</b> {{ article.status }}</p>
|
||||||
<p><b>Price:</b> {{ article.price_in_chf }} {{ currency_name }}</p>
|
<p><b>Price:</b> {{ article.price_in_chf }} {{ currency_name }}</p>
|
||||||
|
{% if user.is_authenticated %}
|
||||||
|
<form id="amount" action="" method="POST" novalidate>
|
||||||
|
{{ amount.as_p }}
|
||||||
|
<input type="submit" value="Add to Cart" />
|
||||||
|
{% csrf_token %}
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<p> please login to fill your basket...</p>
|
||||||
|
{% endif %}
|
||||||
{% for picture in picture_list %}
|
{% for picture in picture_list %}
|
||||||
<p><img src="{{ MEDIA_URL }}{{ picture.image }}" width="200" /></p>
|
<p><img src="{{ MEDIA_URL }}{{ picture.image }}" width="200" /></p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
{% extends "webshop/base.html" %}
|
||||||
|
{% block section_title %}<h1>Cart</h1>{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<h3>List of Items in your Shopping Cart:</h3>
|
||||||
|
{% if articles_list %}
|
||||||
|
<table class="table">
|
||||||
|
<tr class="table_header">
|
||||||
|
<th scope="col">ID</th>
|
||||||
|
<th scope="col">NAME</th>
|
||||||
|
<th scope="col">STOCK</th>
|
||||||
|
<th scope="col">AMOUNT</th>
|
||||||
|
<th scope="col">PRICE</th>
|
||||||
|
</tr>
|
||||||
|
{% for article in articles_list %}
|
||||||
|
<tr class="table_content">
|
||||||
|
<td scope="col">{{ article.id }}</td>
|
||||||
|
<td scope="col">
|
||||||
|
<a href="{% url 'details' article.id %}">
|
||||||
|
{{ article.article.name }}
|
||||||
|
</a></td>
|
||||||
|
<td scope="col">{{ article.article.stock }}</td>
|
||||||
|
<td scope="col">{{ article.amount }}</td>
|
||||||
|
<td scope="col">{{ article.article.price_in_chf }} {{ currency_name }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
{% else %}
|
||||||
|
<p class="alert">
|
||||||
|
There are currently no articles in your cart.
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
|
@ -6,26 +6,18 @@
|
||||||
HOME
|
HOME
|
||||||
</a>
|
</a>
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li><a href="#">CART</a></li>
|
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<li>
|
<li><a href="{% url 'cart' %}">CART</a></li>
|
||||||
<a href="{% url 'profile' %}">PROFILE</a>
|
<li><a href="{% url 'profile' %}">PROFILE</a></li>
|
||||||
</li>
|
<li><a href="{% url 'logout' %}">LOGOUT</a></li>
|
||||||
<li>
|
|
||||||
<a href="{% url 'logout' %}">LOGOUT</a>
|
|
||||||
</li>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<li>
|
<li><a href="{% url 'login' %}">LOGIN</a></li>
|
||||||
<a href="{% url 'login' %}">LOGIN</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li>
|
<li class="dropdown">
|
||||||
{% if article_view %}
|
{% if article_view %}
|
||||||
<form id="currency" name="currency" action="" method="POST" novalidate>
|
<form id="currency" action="" method="POST" novalidate>
|
||||||
{{ currencies_form.as_ul }}
|
{{ currencies_form.as_ul }}
|
||||||
<li>
|
<li><input type="submit" value="Select"></li>
|
||||||
<input type="submit" value="Select">
|
|
||||||
</li>
|
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -17,4 +17,7 @@ urlpatterns = [
|
||||||
url(r'^registration/$',
|
url(r'^registration/$',
|
||||||
views.registration,
|
views.registration,
|
||||||
name='registration'),
|
name='registration'),
|
||||||
|
url(r'^cart/$',
|
||||||
|
views.cart,
|
||||||
|
name='cart'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -4,8 +4,8 @@ from django.contrib.auth.decorators import login_required
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.auth.forms import UserCreationForm
|
from django.contrib.auth.forms import UserCreationForm
|
||||||
from webshop.models import (Article, Category, ArticleStatus, Person,
|
from webshop.models import (Article, Category, ArticleStatus, Person,
|
||||||
City, Picture)
|
City, Picture, CartPosition, ShoppingCart)
|
||||||
from webshop.forms import RegistrationForm
|
from webshop.forms import RegistrationForm, AddToCartForm
|
||||||
|
|
||||||
from currencies.models import ExchangeRate, ExchangeRate_name
|
from currencies.models import ExchangeRate, ExchangeRate_name
|
||||||
from currencies.forms import CurrenciesForm
|
from currencies.forms import CurrenciesForm
|
||||||
|
@ -33,7 +33,7 @@ def index(request):
|
||||||
articles = Article.objects.all().exclude(status=get_hidden_status_id())
|
articles = Article.objects.all().exclude(status=get_hidden_status_id())
|
||||||
articles_list = list(articles)
|
articles_list = list(articles)
|
||||||
currencies_form = CurrenciesForm
|
currencies_form = CurrenciesForm
|
||||||
rate=ExchangeRate
|
rate = ExchangeRate
|
||||||
article_view = True
|
article_view = True
|
||||||
currency_name = "CHF"
|
currency_name = "CHF"
|
||||||
|
|
||||||
|
@ -47,24 +47,26 @@ def index(request):
|
||||||
if cf['currencies']:
|
if cf['currencies']:
|
||||||
selection = cf['currencies']
|
selection = cf['currencies']
|
||||||
request.session['currency'] = selection.id
|
request.session['currency'] = selection.id
|
||||||
currency_name=ExchangeRate_name.objects.get(id=selection.id)
|
currency_name = ExchangeRate_name.objects.get(id=selection.id)
|
||||||
else:
|
else:
|
||||||
request.session['currency'] = None
|
request.session['currency'] = None
|
||||||
|
|
||||||
if request.session['currency']:
|
if request.session['currency']:
|
||||||
currency = request.session['currency']
|
currency = request.session['currency']
|
||||||
for idx, article in enumerate(articles_list):
|
for idx, article in enumerate(articles_list):
|
||||||
article.price_in_chf = rate.exchange(currency, article.price_in_chf)
|
article.price_in_chf = rate.exchange(
|
||||||
|
currency, article.price_in_chf
|
||||||
|
)
|
||||||
articles_list[idx] = article
|
articles_list[idx] = article
|
||||||
currency_name=ExchangeRate_name.objects.get(id=currency)
|
currency_name = ExchangeRate_name.objects.get(id=currency)
|
||||||
|
|
||||||
return render(request,
|
return render(request,
|
||||||
'webshop/index.html',
|
'webshop/index.html',
|
||||||
{'category_list': category_list,
|
{'category_list': category_list,
|
||||||
'articles_list': articles_list,
|
'articles_list': articles_list,
|
||||||
'currencies_form': currencies_form,
|
'currencies_form': currencies_form,
|
||||||
'article_view': article_view,
|
'article_view': article_view,
|
||||||
'currency_name': currency_name})
|
'currency_name': currency_name})
|
||||||
|
|
||||||
|
|
||||||
def articles_in_category(request, category_id):
|
def articles_in_category(request, category_id):
|
||||||
|
@ -74,7 +76,7 @@ def articles_in_category(request, category_id):
|
||||||
category=selected_category.id).exclude(status=get_hidden_status_id())
|
category=selected_category.id).exclude(status=get_hidden_status_id())
|
||||||
articles_list = list(articles)
|
articles_list = list(articles)
|
||||||
currencies_form = CurrenciesForm
|
currencies_form = CurrenciesForm
|
||||||
rate=ExchangeRate
|
rate = ExchangeRate
|
||||||
article_view = True
|
article_view = True
|
||||||
currency_name = "CHF"
|
currency_name = "CHF"
|
||||||
|
|
||||||
|
@ -88,16 +90,17 @@ def articles_in_category(request, category_id):
|
||||||
if cf['currencies']:
|
if cf['currencies']:
|
||||||
selection = cf['currencies']
|
selection = cf['currencies']
|
||||||
request.session['currency'] = selection.id
|
request.session['currency'] = selection.id
|
||||||
currency_name=ExchangeRate_name.objects.get(id=selection.id)
|
currency_name = ExchangeRate_name.objects.get(id=selection.id)
|
||||||
else:
|
else:
|
||||||
request.session['currency'] = None
|
request.session['currency'] = None
|
||||||
|
|
||||||
if request.session['currency']:
|
if request.session['currency']:
|
||||||
currency = request.session['currency']
|
currency = request.session['currency']
|
||||||
for idx, article in enumerate(articles_list):
|
for idx, article in enumerate(articles_list):
|
||||||
article.price_in_chf = rate.exchange(currency, article.price_in_chf)
|
article.price_in_chf = rate.exchange(
|
||||||
|
currency, article.price_in_chf)
|
||||||
articles_list[idx] = article
|
articles_list[idx] = article
|
||||||
currency_name=ExchangeRate_name.objects.get(id=currency)
|
currency_name = ExchangeRate_name.objects.get(id=currency)
|
||||||
|
|
||||||
return render(request, 'webshop/category.html',
|
return render(request, 'webshop/category.html',
|
||||||
{'articles_list': articles_list,
|
{'articles_list': articles_list,
|
||||||
|
@ -111,7 +114,8 @@ def articles_in_category(request, category_id):
|
||||||
def article_details(request, article_id):
|
def article_details(request, article_id):
|
||||||
category_list = get_categories()
|
category_list = get_categories()
|
||||||
currencies_form = CurrenciesForm
|
currencies_form = CurrenciesForm
|
||||||
rate=ExchangeRate
|
amount = AddToCartForm
|
||||||
|
rate = ExchangeRate
|
||||||
article_view = True
|
article_view = True
|
||||||
currency_name = "CHF"
|
currency_name = "CHF"
|
||||||
|
|
||||||
|
@ -122,20 +126,53 @@ def article_details(request, article_id):
|
||||||
picture_list = Picture.objects.filter(article=article_id)
|
picture_list = Picture.objects.filter(article=article_id)
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
currencies_form = CurrenciesForm(request.POST)
|
print(request.POST)
|
||||||
if currencies_form.is_valid():
|
# hier wird das Currency dropdown bearbeitet:
|
||||||
cf = currencies_form.cleaned_data
|
if 'currencies' in request.POST:
|
||||||
if cf['currencies']:
|
currencies_form = CurrenciesForm(request.POST)
|
||||||
selection = cf['currencies']
|
print("currencies_form")
|
||||||
request.session['currency'] = selection.id
|
if currencies_form.is_valid():
|
||||||
currency_name=ExchangeRate_name.objects.get(id=selection.id)
|
cf = currencies_form.cleaned_data
|
||||||
else:
|
if cf['currencies']:
|
||||||
request.session['currency'] = None
|
selection = cf['currencies']
|
||||||
|
request.session['currency'] = selection.id
|
||||||
|
currency_name = ExchangeRate_name.objects.get(
|
||||||
|
id=selection.id)
|
||||||
|
else:
|
||||||
|
request.session['currency'] = None
|
||||||
|
|
||||||
|
# hier wird der Artikel in den Wahrenkorb transferiert:
|
||||||
|
if 'amount' in request.POST:
|
||||||
|
amount = AddToCartForm(request.POST)
|
||||||
|
print("add_to_cart_form")
|
||||||
|
if amount.is_valid():
|
||||||
|
print("is valid")
|
||||||
|
amount = amount.cleaned_data['amount']
|
||||||
|
currency_id = request.session['currency']
|
||||||
|
print("amount:", amount,
|
||||||
|
"article_id:", article_id,
|
||||||
|
"currency_id:", currency_id)
|
||||||
|
article = Article.objects.get(id=article_id)
|
||||||
|
try:
|
||||||
|
cart_id = ShoppingCart.objects.get(user=request.user)
|
||||||
|
except:
|
||||||
|
cart_id = ShoppingCart.objects.create(user=request.user)
|
||||||
|
cart_id.save()
|
||||||
|
if cart_id:
|
||||||
|
cart_position = CartPosition.objects.create(
|
||||||
|
article=article,
|
||||||
|
amount=amount,
|
||||||
|
cart=ShoppingCart.objects.get(user=request.user)
|
||||||
|
)
|
||||||
|
cart_position.save()
|
||||||
|
amount = AddToCartForm()
|
||||||
|
else:
|
||||||
|
amount = AddToCartForm()
|
||||||
|
|
||||||
if request.session['currency']:
|
if request.session['currency']:
|
||||||
currency = request.session['currency']
|
currency = request.session['currency']
|
||||||
article.price_in_chf = rate.exchange(currency, article.price_in_chf)
|
article.price_in_chf = rate.exchange(currency, article.price_in_chf)
|
||||||
currency_name=ExchangeRate_name.objects.get(id=currency)
|
currency_name = ExchangeRate_name.objects.get(id=currency)
|
||||||
|
|
||||||
return render(request, 'webshop/article_details.html',
|
return render(request, 'webshop/article_details.html',
|
||||||
{'article': article,
|
{'article': article,
|
||||||
|
@ -143,7 +180,10 @@ def article_details(request, article_id):
|
||||||
'currencies_form': currencies_form,
|
'currencies_form': currencies_form,
|
||||||
'article_view': article_view,
|
'article_view': article_view,
|
||||||
'currency_name': currency_name,
|
'currency_name': currency_name,
|
||||||
'picture_list': picture_list})
|
'picture_list': picture_list,
|
||||||
|
'amount': amount
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def profile(request):
|
def profile(request):
|
||||||
|
@ -183,3 +223,55 @@ def registration(request):
|
||||||
{'profile_form': profile_form,
|
{'profile_form': profile_form,
|
||||||
'category_list': category_list,
|
'category_list': category_list,
|
||||||
'user_form': user_form})
|
'user_form': user_form})
|
||||||
|
|
||||||
|
|
||||||
|
def cart(request):
|
||||||
|
category_list = get_categories()
|
||||||
|
currencies_form = CurrenciesForm
|
||||||
|
rate = ExchangeRate
|
||||||
|
article_view = True
|
||||||
|
currency_name = "CHF"
|
||||||
|
message = ""
|
||||||
|
cart_id = False
|
||||||
|
articles_list = ""
|
||||||
|
|
||||||
|
if not 'currency' in request.session:
|
||||||
|
request.session['currency'] = None
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
currencies_form = CurrenciesForm(request.POST)
|
||||||
|
if currencies_form.is_valid():
|
||||||
|
cf = currencies_form.cleaned_data
|
||||||
|
if cf['currencies']:
|
||||||
|
selection = cf['currencies']
|
||||||
|
request.session['currency'] = selection.id
|
||||||
|
currency_name = ExchangeRate_name.objects.get(id=selection.id)
|
||||||
|
else:
|
||||||
|
request.session['currency'] = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
cart_id = ShoppingCart.objects.get(user=request.user)
|
||||||
|
except Exception as e:
|
||||||
|
message = "You have no items in the Basket"
|
||||||
|
if cart_id and request.session['currency']:
|
||||||
|
articles = CartPosition.objects.filter(cart=cart_id)
|
||||||
|
articles_list = list(articles)
|
||||||
|
currency = request.session['currency']
|
||||||
|
for idx, article in enumerate(articles_list):
|
||||||
|
article.price_in_chf = rate.exchange(
|
||||||
|
currency, article.article.price_in_chf)
|
||||||
|
articles_list[idx] = article
|
||||||
|
currency_name = ExchangeRate_name.objects.get(id=currency)
|
||||||
|
article.price_in_chf = rate.exchange(currency, article.price_in_chf)
|
||||||
|
else:
|
||||||
|
articles = CartPosition.objects.filter(cart=cart_id)
|
||||||
|
articles_list = list(articles)
|
||||||
|
|
||||||
|
return render(request, 'webshop/cart.html',
|
||||||
|
{'articles_list': articles_list,
|
||||||
|
'currencies_form': currencies_form,
|
||||||
|
'article_view': article_view,
|
||||||
|
'currency_name': currency_name,
|
||||||
|
'category_list': category_list,
|
||||||
|
'message': message,
|
||||||
|
})
|
||||||
|
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 121 KiB |
Loading…
Reference in New Issue