mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-05 13:21:49 +02:00
basic order page
This commit is contained in:
parent
90dfb1c543
commit
42380cd17f
11 changed files with 279 additions and 157 deletions
|
@ -1,29 +1,23 @@
|
||||||
|
from django import forms
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
|
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
|
|
||||||
from la_chariotte.order.models import GroupedOrder, Item
|
from la_chariotte.order.models import GroupedOrder, Item
|
||||||
|
|
||||||
from django.forms import ( # isort:skip
|
|
||||||
CharField,
|
|
||||||
DateInput,
|
|
||||||
DateTimeInput,
|
|
||||||
ModelForm,
|
|
||||||
Textarea,
|
|
||||||
TextInput,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
class GroupedOrderForm(forms.ModelForm):
|
||||||
class GroupedOrderForm(ModelForm):
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = GroupedOrder
|
model = GroupedOrder
|
||||||
fields = ["name", "deadline", "delivery_date", "place", "description"]
|
fields = ["name", "deadline", "delivery_date", "place", "description"]
|
||||||
widgets = {
|
widgets = {
|
||||||
"name": TextInput(attrs={"placeholder": "ex : Des oranges pour Noël"}),
|
"name": forms.TextInput(
|
||||||
"deadline": DateTimeInput(attrs={"placeholder": "JJ/MM/AAAA HH:MM"}),
|
attrs={"placeholder": "ex : Des oranges pour Noël"}
|
||||||
"delivery_date": DateInput(attrs={"placeholder": "JJ/MM/AAAA"}),
|
),
|
||||||
"place": TextInput(attrs={"placeholder": "(facultatif)"}),
|
"deadline": forms.DateTimeInput(attrs={"placeholder": "JJ/MM/AAAA HH:MM"}),
|
||||||
"description": Textarea(
|
"delivery_date": forms.DateInput(attrs={"placeholder": "JJ/MM/AAAA"}),
|
||||||
|
"place": forms.TextInput(attrs={"placeholder": "(facultatif)"}),
|
||||||
|
"description": forms.Textarea(
|
||||||
attrs={
|
attrs={
|
||||||
"placeholder": "Plus d'infos sur la commande groupée ? (facultatif)"
|
"placeholder": "Plus d'infos sur la commande groupée ? (facultatif)"
|
||||||
}
|
}
|
||||||
|
@ -56,7 +50,7 @@ class GroupedOrderForm(ModelForm):
|
||||||
return cleaned_data
|
return cleaned_data
|
||||||
|
|
||||||
|
|
||||||
class ItemCreateForm(ModelForm):
|
class ItemCreateForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Item
|
model = Item
|
||||||
fields = ["name", "price", "max_limit"]
|
fields = ["name", "price", "max_limit"]
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
# Generated by Django 4.2 on 2023-05-12 09:48
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
("order", "0016_alter_groupedorder_description"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="OrderAuthor",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"id",
|
||||||
|
models.BigAutoField(
|
||||||
|
auto_created=True,
|
||||||
|
primary_key=True,
|
||||||
|
serialize=False,
|
||||||
|
verbose_name="ID",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("first_name", models.CharField(verbose_name="Prénom")),
|
||||||
|
("last_name", models.CharField(verbose_name="Nom")),
|
||||||
|
(
|
||||||
|
"phone",
|
||||||
|
models.CharField(
|
||||||
|
help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin",
|
||||||
|
verbose_name="Numéro de téléphone",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"email",
|
||||||
|
models.CharField(
|
||||||
|
verbose_name="Pour vous que l'organisateur·ice vous contacte en cas de besoin"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="order",
|
||||||
|
name="author",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE, to="order.orderauthor"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
|
@ -9,7 +9,7 @@ from la_chariotte.settings import AUTH_USER_MODEL
|
||||||
class GroupedOrder(models.Model):
|
class GroupedOrder(models.Model):
|
||||||
name = models.CharField(
|
name = models.CharField(
|
||||||
max_length=100, null=True, verbose_name="Titre de la commande"
|
max_length=100, null=True, verbose_name="Titre de la commande"
|
||||||
) # optionnal
|
)
|
||||||
orga = models.ForeignKey(
|
orga = models.ForeignKey(
|
||||||
AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Organisateur·ice"
|
AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Organisateur·ice"
|
||||||
)
|
)
|
||||||
|
@ -55,13 +55,29 @@ class GroupedOrder(models.Model):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class OrderAuthor(models.Model):
|
||||||
|
"""Created when a user orders without having an account - or when a user creates an account"""
|
||||||
|
|
||||||
|
# TODO faire le lien avec CustomUser (CustomUser hérite de OrderAuthor), pour ensuite préremplir quand on est connecté·e
|
||||||
|
first_name = models.CharField(verbose_name="Prénom")
|
||||||
|
last_name = models.CharField(verbose_name="Nom")
|
||||||
|
phone = models.CharField(
|
||||||
|
verbose_name="Numéro de téléphone",
|
||||||
|
help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin",
|
||||||
|
)
|
||||||
|
email = models.CharField(
|
||||||
|
verbose_name="Pour vous que l'organisateur·ice vous contacte en cas de besoin"
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self): # pragma: no cover
|
||||||
|
return f"{self.first_name} {self.last_name}"
|
||||||
|
|
||||||
|
|
||||||
class Order(models.Model):
|
class Order(models.Model):
|
||||||
grouped_order = models.ForeignKey(
|
grouped_order = models.ForeignKey(
|
||||||
GroupedOrder, on_delete=models.CASCADE, related_name="order_set"
|
GroupedOrder, on_delete=models.CASCADE, related_name="order_set"
|
||||||
)
|
)
|
||||||
author = models.CharField(
|
author = models.ForeignKey(OrderAuthor, on_delete=models.CASCADE)
|
||||||
max_length=100, verbose_name="Personne qui passe la commande"
|
|
||||||
) # a changer, utiliser ForeignKey de user
|
|
||||||
|
|
||||||
def __str__(self): # pragma: no cover
|
def __str__(self): # pragma: no cover
|
||||||
return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}"
|
return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}"
|
||||||
|
@ -85,7 +101,7 @@ class Item(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class OrderedItem(models.Model):
|
class OrderedItem(models.Model):
|
||||||
"""Item in one specific Order, and its number"""
|
"""Item in one specific Order, and the number of articles"""
|
||||||
|
|
||||||
nb = models.PositiveSmallIntegerField(default=0) # works up to 32767
|
nb = models.PositiveSmallIntegerField(default=0) # works up to 32767
|
||||||
order = models.ForeignKey(
|
order = models.ForeignKey(
|
||||||
|
|
|
@ -26,15 +26,15 @@
|
||||||
<form method="post" action="{{ create_item_url }}">
|
<form method="post" action="{{ create_item_url }}">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<td><input name="name" maxlength="100" placeholder="Nom du produit" required></input></td>
|
<td><input name="name" maxlength="100" placeholder="Nom du produit" required></input></td>
|
||||||
<td><input name="price" maxlength="50" placeholder="5,40" required></input> €</td>
|
<td><input name="price" size="2" placeholder="5,40" required></input> €</td>
|
||||||
<td><input name="max_limit" maxlength="50" placeholder="42"></input></td>
|
<td><input name="max_limit" size="2" placeholder="42"></input></td>
|
||||||
<td><button type="submit" class="button is-primary">Ajouter</button></td>
|
<td><button type="submit" class="button is-primary">Ajouter</button></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% for item in item_list %}
|
{% for item in item_list %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ item.name }}</td>
|
<td>{{ item.name }}</td>
|
||||||
<td>{{ item.price }}</td>
|
<td>{{ item.price }}</td>
|
||||||
<td>{{ item.max_limit }}</td>
|
<td>{% if item.max_limit %}{{ item.max_limit }}{% else %}---{% endif %}</td>
|
||||||
<td>Supprimer (pas possible pour l'instant)</td>
|
<td>Supprimer (pas possible pour l'instant)</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -5,42 +5,84 @@
|
||||||
{% block content_title %}{{ grouped_order }} : commander{% endblock %}
|
{% block content_title %}{{ grouped_order }} : commander{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<p>{{ grouped_order }}
|
<div class="box">
|
||||||
<p>Organisateur·ice : {{ grouped_order.orga }}</p>
|
<div class="columns">
|
||||||
<p>Date de livraison : {{ grouped_order.delivery_date }}</p>
|
<div class="column is-8">
|
||||||
<p>Date limite de commande : {{ grouped_order.deadline }}</p>
|
<p class="title">{{ grouped_order }}</p>
|
||||||
{% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %}
|
{% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %}
|
||||||
{% if not user.is_authenticated %}
|
{% if not user.is_authenticated %}
|
||||||
<p>Vous êtes l'organisateur·ice de cette commande groupée ?
|
<p><span class="has-text-dark is-italic">Vous êtes l'organisateur·ice ?</span>
|
||||||
<a href="{% url 'order:grouped_order_overview' grouped_order.id %}">
|
<a href="{% url 'order:grouped_order_overview' grouped_order.id %}">
|
||||||
Connectez-vous pour accéder à la page de gestion</a>
|
Connectez-vous pour accéder à la page de gestion</a>
|
||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
{% if grouped_order.place %}
|
||||||
|
<p>Lieu : {{ grouped_order.place }}</p>
|
||||||
|
{% endif %}
|
||||||
|
<p>Date de livraison : {{ grouped_order.delivery_date }}</p>
|
||||||
|
<p>Date limite de commande : {{ grouped_order.deadline }}</p>
|
||||||
|
{% if user == grouped_order.orga %}
|
||||||
|
<a class="button is-primary" href="{% url 'order:grouped_order_overview' grouped_order.id %}">
|
||||||
|
Gestion de la commande groupée</a>
|
||||||
|
{% else %}
|
||||||
|
<p>Organisateur·ice : {{ grouped_order.orga }}</p>
|
||||||
|
<a class="button is-light" href="mailto:{{ grouped_order.orga.username }}">Contacter l'organisateur·ice</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% if user == grouped_order.orga %}
|
<div class="box">
|
||||||
<a href="{% url 'order:grouped_order_overview' grouped_order.id %}">
|
{% if grouped_order.item_set.first %}
|
||||||
Page de gestion de la comande groupée</a>
|
<p class="title">Commander</p>
|
||||||
{% endif %}
|
<form method="post" action="{% url 'order:order' grouped_order.id %}">
|
||||||
|
<table class="table">
|
||||||
<p>les produits disponibles pour cette commande groupée : </p>
|
<thead>
|
||||||
|
<tr>
|
||||||
<ul>
|
<th>Produit</th>
|
||||||
{% for item in grouped_order.item_set.all %}
|
<th>Prix unitaire</th>
|
||||||
<li>
|
<th>Quantité</th>
|
||||||
{{ item }}
|
<th>Total</th>
|
||||||
</li>
|
</tr>
|
||||||
{% endfor %}
|
</thead>
|
||||||
</ul>
|
<tbody>
|
||||||
<form action="{% url 'order:order' grouped_order.id %}" method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
<fieldset>
|
|
||||||
<legend><h1>Commander</h1></legend>
|
|
||||||
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
|
|
||||||
{% for item in grouped_order.item_set.all %}
|
{% for item in grouped_order.item_set.all %}
|
||||||
<input type="radio" name="item" id="item{{ forloop.counter }}" value="{{ item.id }}">
|
<tr>
|
||||||
<label for="item{{ forloop.counter }}">{{ item }}</label><br>
|
{% csrf_token %}
|
||||||
|
<td>{{ item.name }}</td>
|
||||||
|
<td>{{ item.price }} €</td>
|
||||||
|
<td><input name="quantity_{{ item.id }}" size="2" value="0"></input></td>
|
||||||
|
<td>Total pour ce produit</td>
|
||||||
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</fieldset>
|
</tbody>
|
||||||
<input type="submit" value="Order">
|
</table>
|
||||||
|
<br>
|
||||||
|
<p class="title">Vos informations</p>
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column">
|
||||||
|
<p><label for="first_name">Prénom : </label>
|
||||||
|
<input id="first_name" type="text" name="first_name" required></p>
|
||||||
|
<p><label for="first_name">Nom : </label>
|
||||||
|
<input id="last_name" type="text" name="last_name" required></p>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<p><label for="phone">Numéro de téléphone :</label>
|
||||||
|
<input id="phone" type="text" name="phone" required></p>
|
||||||
|
<p><label for="email">Adresse mail : </label>
|
||||||
|
<input id="email" type="text" name="email" required></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="buttons">
|
||||||
|
<button type="submit" value="Order" class="button is-primary">Commander</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<p>Il n'y a pas de produits disponibles dans cette commande !</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -24,7 +24,7 @@
|
||||||
<ul>
|
<ul>
|
||||||
{% for order in grouped_order.order_set.all %}
|
{% for order in grouped_order.order_set.all %}
|
||||||
<li>
|
<li>
|
||||||
{{ order }} : {{ order.ordered_items.count }} produits commandés
|
{{ order }} : [prix total]
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.contrib import auth
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from la_chariotte.order.models import GroupedOrder, Item, Order
|
from la_chariotte.order.models import GroupedOrder, Item, Order, OrderAuthor
|
||||||
|
|
||||||
pytestmark = pytest.mark.django_db
|
pytestmark = pytest.mark.django_db
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ class TestGroupedOrderIndexView:
|
||||||
class TestGroupedOrderDetailView:
|
class TestGroupedOrderDetailView:
|
||||||
def test_order_item(self, client, other_user):
|
def test_order_item(self, client, other_user):
|
||||||
"""
|
"""
|
||||||
From the OrderDetailView, we order an item using the order form, and it creates an Order woth and Ordered_item inside
|
From the OrderDetailView, we order an item using the order form, and it creates an Order with an Ordered_item inside
|
||||||
"""
|
"""
|
||||||
grouped_order = create_grouped_order(
|
grouped_order = create_grouped_order(
|
||||||
days_before_delivery_date=5,
|
days_before_delivery_date=5,
|
||||||
|
@ -214,7 +214,10 @@ class TestGroupedOrderDetailView:
|
||||||
orga_user=other_user,
|
orga_user=other_user,
|
||||||
)
|
)
|
||||||
item = Item.objects.create(
|
item = Item.objects.create(
|
||||||
name="test item", grouped_order=grouped_order, price=1
|
name="test item 1", grouped_order=grouped_order, price=1
|
||||||
|
)
|
||||||
|
item2 = Item.objects.create(
|
||||||
|
name="test item 2", grouped_order=grouped_order, price=5
|
||||||
)
|
)
|
||||||
detail_url = reverse(
|
detail_url = reverse(
|
||||||
"order:grouped_order_detail",
|
"order:grouped_order_detail",
|
||||||
|
@ -227,6 +230,7 @@ class TestGroupedOrderDetailView:
|
||||||
assert "test item" in response.content.decode()
|
assert "test item" in response.content.decode()
|
||||||
assert "gr order test" in response.content.decode()
|
assert "gr order test" in response.content.decode()
|
||||||
assert item.ordered_nb == 0
|
assert item.ordered_nb == 0
|
||||||
|
assert item2.ordered_nb == 0
|
||||||
order_url = reverse(
|
order_url = reverse(
|
||||||
"order:order",
|
"order:order",
|
||||||
kwargs={
|
kwargs={
|
||||||
|
@ -236,7 +240,12 @@ class TestGroupedOrderDetailView:
|
||||||
response = client.post(
|
response = client.post(
|
||||||
order_url,
|
order_url,
|
||||||
{
|
{
|
||||||
"item": item.pk,
|
f"quantity_{item.pk}": 4,
|
||||||
|
f"quantity_{item2.pk}": 1,
|
||||||
|
"first_name": "Prénom",
|
||||||
|
"last_name": "Nom",
|
||||||
|
"phone": "0645632569",
|
||||||
|
"email": "test@mail.fr",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
assert response.status_code == 302
|
assert response.status_code == 302
|
||||||
|
@ -247,15 +256,18 @@ class TestGroupedOrderDetailView:
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
item.refresh_from_db()
|
item.refresh_from_db()
|
||||||
assert item.ordered_nb == 1
|
item2.refresh_from_db()
|
||||||
|
assert OrderAuthor.objects.first().first_name == "Prénom"
|
||||||
|
assert item.ordered_nb == 4
|
||||||
|
assert item2.ordered_nb == 1
|
||||||
order = Order.objects.first()
|
order = Order.objects.first()
|
||||||
assert order.ordered_items.count() == 1
|
assert order.ordered_items.count() == 2
|
||||||
|
|
||||||
|
|
||||||
class TestGroupedOrderOrgaView:
|
class TestGroupedOrderOverview:
|
||||||
def test_user_not_logged_redirect(self, client, other_user):
|
def test_user_not_logged_redirect(self, client, other_user):
|
||||||
"""
|
"""
|
||||||
A user that is not logged cannot see the GroupedOrderOrgaView. They get redirected to the login view
|
A user that is not logged cannot see the GroupedOrderOverview. They get redirected to the login view
|
||||||
"""
|
"""
|
||||||
grouped_order = create_grouped_order(
|
grouped_order = create_grouped_order(
|
||||||
days_before_delivery_date=5,
|
days_before_delivery_date=5,
|
||||||
|
@ -284,7 +296,7 @@ class TestGroupedOrderOrgaView:
|
||||||
|
|
||||||
def test_user_not_orga_redirect(self, client_log, other_user):
|
def test_user_not_orga_redirect(self, client_log, other_user):
|
||||||
"""
|
"""
|
||||||
A user that is not orga cannot see the GroupedOrderOrgaView.
|
A user that is not orga cannot see the GroupedOrderOverview.
|
||||||
They get a 403 forbidden error
|
They get a 403 forbidden error
|
||||||
"""
|
"""
|
||||||
grouped_order = create_grouped_order(
|
grouped_order = create_grouped_order(
|
||||||
|
@ -358,7 +370,7 @@ class TestGroupedOrderAddItemsView:
|
||||||
|
|
||||||
def test_get_manage_items__anonymous_user(self, client, other_user):
|
def test_get_manage_items__anonymous_user(self, client, other_user):
|
||||||
"""
|
"""
|
||||||
A user that is not logged cannot see the GroupedOrderOrgaView. They get redirected to the login view
|
A user that is not logged cannot see the GroupedOrderOverview. They get redirected to the login view
|
||||||
"""
|
"""
|
||||||
grouped_order = create_grouped_order(
|
grouped_order = create_grouped_order(
|
||||||
days_before_delivery_date=5,
|
days_before_delivery_date=5,
|
||||||
|
|
|
@ -10,7 +10,7 @@ urlpatterns = [
|
||||||
),
|
),
|
||||||
path(
|
path(
|
||||||
"<int:pk>/gerer",
|
"<int:pk>/gerer",
|
||||||
views.GroupedOrderOrgaView.as_view(),
|
views.GroupedOrderOverview.as_view(),
|
||||||
name="grouped_order_overview",
|
name="grouped_order_overview",
|
||||||
),
|
),
|
||||||
path("<int:grouped_order_id>/commander/", views.order, name="order"),
|
path("<int:grouped_order_id>/commander/", views.order, name="order"),
|
||||||
|
|
|
@ -6,7 +6,7 @@ from django.utils import timezone
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
from .forms import GroupedOrderForm, ItemCreateForm
|
from .forms import GroupedOrderForm, ItemCreateForm
|
||||||
from .models import GroupedOrder, Item, Order, OrderedItem
|
from .models import GroupedOrder, Item, Order, OrderAuthor, OrderedItem
|
||||||
|
|
||||||
|
|
||||||
class IndexView(LoginRequiredMixin, generic.ListView):
|
class IndexView(LoginRequiredMixin, generic.ListView):
|
||||||
|
@ -59,7 +59,7 @@ class GroupedOrderDetailView(generic.DetailView):
|
||||||
context_object_name = "grouped_order"
|
context_object_name = "grouped_order"
|
||||||
|
|
||||||
|
|
||||||
class GroupedOrderOrgaView(UserPassesTestMixin, generic.DetailView):
|
class GroupedOrderOverview(UserPassesTestMixin, generic.DetailView):
|
||||||
"""Overview of a grouped order, for the organizer"""
|
"""Overview of a grouped order, for the organizer"""
|
||||||
|
|
||||||
model = GroupedOrder
|
model = GroupedOrder
|
||||||
|
@ -124,12 +124,19 @@ class ItemCreateView(UserPassesTestMixin, generic.CreateView):
|
||||||
return GroupedOrder.objects.get(pk=grouped_order_id).orga == self.request.user
|
return GroupedOrder.objects.get(pk=grouped_order_id).orga == self.request.user
|
||||||
|
|
||||||
|
|
||||||
def order(
|
def order(request, grouped_order_id):
|
||||||
request, grouped_order_id
|
"""Creates an AnonymousUser, and an Order for this GroupedOrder, with related OrderedItems"""
|
||||||
): # crée une commande (order) pour cette commande groupée, avec l'item selectionné dedans
|
|
||||||
grouped_order = get_object_or_404(GroupedOrder, pk=grouped_order_id)
|
grouped_order = get_object_or_404(GroupedOrder, pk=grouped_order_id)
|
||||||
try:
|
try:
|
||||||
selected_item = grouped_order.item_set.get(pk=request.POST["item"])
|
# get a dict with (quantity_{{item_id}}:{{quantity}})
|
||||||
|
orders_dict = {
|
||||||
|
k: v for k, v in request.POST.items() if k.startswith("quantity")
|
||||||
|
}
|
||||||
|
first_name = request.POST["first_name"]
|
||||||
|
last_name = request.POST["last_name"]
|
||||||
|
phone = request.POST["phone"]
|
||||||
|
email = request.POST["email"]
|
||||||
|
# selected_item = grouped_order.item_set.get(pk=request.POST["item"])
|
||||||
except (KeyError, Item.DoesNotExist):
|
except (KeyError, Item.DoesNotExist):
|
||||||
# Redisplay the order form for this grouped order.
|
# Redisplay the order form for this grouped order.
|
||||||
return render(
|
return render(
|
||||||
|
@ -137,14 +144,16 @@ def order(
|
||||||
"order/grouped_order_detail.html",
|
"order/grouped_order_detail.html",
|
||||||
{
|
{
|
||||||
"grouped_order": grouped_order,
|
"grouped_order": grouped_order,
|
||||||
"error_message": "You didn't select an item.",
|
"error_message": "Veuillez remplir tous les champs",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
order = Order.objects.create(author="Auteur teur", grouped_order=grouped_order)
|
author = OrderAuthor.objects.create(first_name=first_name, last_name=last_name)
|
||||||
OrderedItem.objects.create(nb=1, order=order, item=selected_item)
|
order = Order.objects.create(author=author, grouped_order=grouped_order)
|
||||||
compute_ordered_nb(selected_item)
|
for k, v in orders_dict.items():
|
||||||
selected_item.save()
|
item = grouped_order.item_set.get(pk=k.split("_")[1])
|
||||||
|
OrderedItem.objects.create(nb=v, order=order, item=item)
|
||||||
|
compute_ordered_nb(item)
|
||||||
# Always return an HttpResponseRedirect after successfully dealing
|
# Always return an HttpResponseRedirect after successfully dealing
|
||||||
# with POST data. This prevents data from being posted twice if a
|
# with POST data. This prevents data from being posted twice if a
|
||||||
# user hits the Back button.
|
# user hits the Back button.
|
||||||
|
@ -154,7 +163,7 @@ def order(
|
||||||
|
|
||||||
|
|
||||||
def compute_ordered_nb(item):
|
def compute_ordered_nb(item):
|
||||||
"""Calcule le nombre de produits de ce type commandés (pour cette commande groupée)"""
|
"""Computes the number of ordered articles for this item in this grouped order"""
|
||||||
ordered_nb = 0
|
ordered_nb = 0
|
||||||
for order in item.orders.all():
|
for order in item.orders.all():
|
||||||
ordered_nb += order.nb
|
ordered_nb += order.nb
|
||||||
|
|
|
@ -1054,12 +1054,12 @@ a.box:active {
|
||||||
color: #3850b7;
|
color: #3850b7;
|
||||||
}
|
}
|
||||||
.button.is-info {
|
.button.is-info {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.button.is-info:hover, .button.is-info.is-hovered {
|
.button.is-info:hover, .button.is-info.is-hovered {
|
||||||
background-color: #9b264c;
|
background-color: #e8ab3e;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
@ -1068,21 +1068,21 @@ a.box:active {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) {
|
.button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) {
|
||||||
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25);
|
box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
|
||||||
}
|
}
|
||||||
.button.is-info:active, .button.is-info.is-active {
|
.button.is-info:active, .button.is-info.is-active {
|
||||||
background-color: #912447;
|
background-color: #e6a632;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.button.is-info[disabled], fieldset[disabled] .button.is-info {
|
.button.is-info[disabled], fieldset[disabled] .button.is-info {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
.button.is-info.is-inverted {
|
.button.is-info.is-inverted {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
color: #A52951;
|
color: #e9b049;
|
||||||
}
|
}
|
||||||
.button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered {
|
.button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered {
|
||||||
background-color: #f2f2f2;
|
background-color: #f2f2f2;
|
||||||
|
@ -1091,32 +1091,32 @@ a.box:active {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
color: #A52951;
|
color: #e9b049;
|
||||||
}
|
}
|
||||||
.button.is-info.is-loading::after {
|
.button.is-info.is-loading::after {
|
||||||
border-color: transparent transparent #fff #fff !important;
|
border-color: transparent transparent #fff #fff !important;
|
||||||
}
|
}
|
||||||
.button.is-info.is-outlined {
|
.button.is-info.is-outlined {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
color: #A52951;
|
color: #e9b049;
|
||||||
}
|
}
|
||||||
.button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused {
|
.button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.button.is-info.is-outlined.is-loading::after {
|
.button.is-info.is-outlined.is-loading::after {
|
||||||
border-color: transparent transparent #A52951 #A52951 !important;
|
border-color: transparent transparent #e9b049 #e9b049 !important;
|
||||||
}
|
}
|
||||||
.button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after {
|
.button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after {
|
||||||
border-color: transparent transparent #fff #fff !important;
|
border-color: transparent transparent #fff #fff !important;
|
||||||
}
|
}
|
||||||
.button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined {
|
.button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
color: #A52951;
|
color: #e9b049;
|
||||||
}
|
}
|
||||||
.button.is-info.is-inverted.is-outlined {
|
.button.is-info.is-inverted.is-outlined {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
|
@ -1125,10 +1125,10 @@ a.box:active {
|
||||||
}
|
}
|
||||||
.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused {
|
.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
color: #A52951;
|
color: #e9b049;
|
||||||
}
|
}
|
||||||
.button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after {
|
.button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after {
|
||||||
border-color: transparent transparent #A52951 #A52951 !important;
|
border-color: transparent transparent #e9b049 #e9b049 !important;
|
||||||
}
|
}
|
||||||
.button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined {
|
.button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
|
@ -1137,18 +1137,18 @@ a.box:active {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.button.is-info.is-light {
|
.button.is-info.is-light {
|
||||||
background-color: #fbeff3;
|
background-color: #fdf7ed;
|
||||||
color: #cc3364;
|
color: #845b10;
|
||||||
}
|
}
|
||||||
.button.is-info.is-light:hover, .button.is-info.is-light.is-hovered {
|
.button.is-info.is-light:hover, .button.is-info.is-light.is-hovered {
|
||||||
background-color: #f8e4eb;
|
background-color: #fbf2e1;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #cc3364;
|
color: #845b10;
|
||||||
}
|
}
|
||||||
.button.is-info.is-light:active, .button.is-info.is-light.is-active {
|
.button.is-info.is-light:active, .button.is-info.is-light.is-active {
|
||||||
background-color: #f6dae3;
|
background-color: #faedd6;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #cc3364;
|
color: #845b10;
|
||||||
}
|
}
|
||||||
.button.is-success {
|
.button.is-success {
|
||||||
background-color: hsl(153, 53%, 53%);
|
background-color: hsl(153, 53%, 53%);
|
||||||
|
@ -2011,12 +2011,12 @@ div.icon-text {
|
||||||
color: #3850b7;
|
color: #3850b7;
|
||||||
}
|
}
|
||||||
.notification.is-info {
|
.notification.is-info {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.notification.is-info.is-light {
|
.notification.is-info.is-light {
|
||||||
background-color: #fbeff3;
|
background-color: #fdf7ed;
|
||||||
color: #cc3364;
|
color: #845b10;
|
||||||
}
|
}
|
||||||
.notification.is-success {
|
.notification.is-success {
|
||||||
background-color: hsl(153, 53%, 53%);
|
background-color: hsl(153, 53%, 53%);
|
||||||
|
@ -2140,16 +2140,16 @@ div.icon-text {
|
||||||
background-image: linear-gradient(to right, hsl(229, 53%, 53%) 30%, hsl(0, 0%, 93%) 30%);
|
background-image: linear-gradient(to right, hsl(229, 53%, 53%) 30%, hsl(0, 0%, 93%) 30%);
|
||||||
}
|
}
|
||||||
.progress.is-info::-webkit-progress-value {
|
.progress.is-info::-webkit-progress-value {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
}
|
}
|
||||||
.progress.is-info::-moz-progress-bar {
|
.progress.is-info::-moz-progress-bar {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
}
|
}
|
||||||
.progress.is-info::-ms-fill {
|
.progress.is-info::-ms-fill {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
}
|
}
|
||||||
.progress.is-info:indeterminate {
|
.progress.is-info:indeterminate {
|
||||||
background-image: linear-gradient(to right, #A52951 30%, hsl(0, 0%, 93%) 30%);
|
background-image: linear-gradient(to right, #e9b049 30%, hsl(0, 0%, 93%) 30%);
|
||||||
}
|
}
|
||||||
.progress.is-success::-webkit-progress-value {
|
.progress.is-success::-webkit-progress-value {
|
||||||
background-color: hsl(153, 53%, 53%);
|
background-color: hsl(153, 53%, 53%);
|
||||||
|
@ -2274,8 +2274,8 @@ div.icon-text {
|
||||||
}
|
}
|
||||||
.table td.is-info,
|
.table td.is-info,
|
||||||
.table th.is-info {
|
.table th.is-info {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.table td.is-success,
|
.table td.is-success,
|
||||||
|
@ -2497,12 +2497,12 @@ div.icon-text {
|
||||||
color: #3850b7;
|
color: #3850b7;
|
||||||
}
|
}
|
||||||
.tag:not(body).is-info {
|
.tag:not(body).is-info {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.tag:not(body).is-info.is-light {
|
.tag:not(body).is-info.is-light {
|
||||||
background-color: #fbeff3;
|
background-color: #fdf7ed;
|
||||||
color: #cc3364;
|
color: #845b10;
|
||||||
}
|
}
|
||||||
.tag:not(body).is-success {
|
.tag:not(body).is-success {
|
||||||
background-color: hsl(153, 53%, 53%);
|
background-color: hsl(153, 53%, 53%);
|
||||||
|
@ -2793,10 +2793,10 @@ a.tag:hover {
|
||||||
box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25);
|
box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25);
|
||||||
}
|
}
|
||||||
.is-info.textarea, .is-info.input {
|
.is-info.textarea, .is-info.input {
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
}
|
}
|
||||||
.is-info.textarea:focus, .is-info.input:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, .is-info.textarea:active, .is-info.input:active, .is-info.is-active.textarea, .is-info.is-active.input {
|
.is-info.textarea:focus, .is-info.input:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, .is-info.textarea:active, .is-info.input:active, .is-info.is-active.textarea, .is-info.is-active.input {
|
||||||
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25);
|
box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
|
||||||
}
|
}
|
||||||
.is-success.textarea, .is-success.input {
|
.is-success.textarea, .is-success.input {
|
||||||
border-color: hsl(153, 53%, 53%);
|
border-color: hsl(153, 53%, 53%);
|
||||||
|
@ -3006,16 +3006,16 @@ a.tag:hover {
|
||||||
box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25);
|
box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25);
|
||||||
}
|
}
|
||||||
.select.is-info:not(:hover)::after {
|
.select.is-info:not(:hover)::after {
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
}
|
}
|
||||||
.select.is-info select {
|
.select.is-info select {
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
}
|
}
|
||||||
.select.is-info select:hover, .select.is-info select.is-hovered {
|
.select.is-info select:hover, .select.is-info select.is-hovered {
|
||||||
border-color: #912447;
|
border-color: #e6a632;
|
||||||
}
|
}
|
||||||
.select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active {
|
.select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active {
|
||||||
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25);
|
box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
|
||||||
}
|
}
|
||||||
.select.is-success:not(:hover)::after {
|
.select.is-success:not(:hover)::after {
|
||||||
border-color: hsl(153, 53%, 53%);
|
border-color: hsl(153, 53%, 53%);
|
||||||
|
@ -3217,22 +3217,22 @@ a.tag:hover {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.file.is-info .file-cta {
|
.file.is-info .file-cta {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta {
|
.file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta {
|
||||||
background-color: #9b264c;
|
background-color: #e8ab3e;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta {
|
.file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta {
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
box-shadow: 0 0 0.5em rgba(165, 41, 81, 0.25);
|
box-shadow: 0 0 0.5em rgba(233, 176, 73, 0.25);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.file.is-info:active .file-cta, .file.is-info.is-active .file-cta {
|
.file.is-info:active .file-cta, .file.is-info.is-active .file-cta {
|
||||||
background-color: #912447;
|
background-color: #e6a632;
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
@ -3498,7 +3498,7 @@ a.tag:hover {
|
||||||
color: hsl(229, 53%, 53%);
|
color: hsl(229, 53%, 53%);
|
||||||
}
|
}
|
||||||
.help.is-info {
|
.help.is-info {
|
||||||
color: #A52951;
|
color: #e9b049;
|
||||||
}
|
}
|
||||||
.help.is-success {
|
.help.is-success {
|
||||||
color: hsl(153, 53%, 53%);
|
color: hsl(153, 53%, 53%);
|
||||||
|
@ -4275,15 +4275,15 @@ button.dropdown-item.is-active {
|
||||||
color: #3850b7;
|
color: #3850b7;
|
||||||
}
|
}
|
||||||
.message.is-info {
|
.message.is-info {
|
||||||
background-color: #fbeff3;
|
background-color: #fdf7ed;
|
||||||
}
|
}
|
||||||
.message.is-info .message-header {
|
.message.is-info .message-header {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.message.is-info .message-body {
|
.message.is-info .message-body {
|
||||||
border-color: #A52951;
|
border-color: #e9b049;
|
||||||
color: #cc3364;
|
color: #845b10;
|
||||||
}
|
}
|
||||||
.message.is-success {
|
.message.is-success {
|
||||||
background-color: #effaf5;
|
background-color: #effaf5;
|
||||||
|
@ -4795,7 +4795,7 @@ button.dropdown-item.is-active {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.navbar.is-info {
|
.navbar.is-info {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.navbar.is-info .navbar-brand > .navbar-item,
|
.navbar.is-info .navbar-brand > .navbar-item,
|
||||||
|
@ -4806,7 +4806,7 @@ button.dropdown-item.is-active {
|
||||||
.navbar.is-info .navbar-brand .navbar-link:focus,
|
.navbar.is-info .navbar-brand .navbar-link:focus,
|
||||||
.navbar.is-info .navbar-brand .navbar-link:hover,
|
.navbar.is-info .navbar-brand .navbar-link:hover,
|
||||||
.navbar.is-info .navbar-brand .navbar-link.is-active {
|
.navbar.is-info .navbar-brand .navbar-link.is-active {
|
||||||
background-color: #912447;
|
background-color: #e6a632;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.navbar.is-info .navbar-brand .navbar-link::after {
|
.navbar.is-info .navbar-brand .navbar-link::after {
|
||||||
|
@ -4832,7 +4832,7 @@ button.dropdown-item.is-active {
|
||||||
.navbar.is-info .navbar-end .navbar-link:focus,
|
.navbar.is-info .navbar-end .navbar-link:focus,
|
||||||
.navbar.is-info .navbar-end .navbar-link:hover,
|
.navbar.is-info .navbar-end .navbar-link:hover,
|
||||||
.navbar.is-info .navbar-end .navbar-link.is-active {
|
.navbar.is-info .navbar-end .navbar-link.is-active {
|
||||||
background-color: #912447;
|
background-color: #e6a632;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.navbar.is-info .navbar-start .navbar-link::after,
|
.navbar.is-info .navbar-start .navbar-link::after,
|
||||||
|
@ -4842,11 +4842,11 @@ button.dropdown-item.is-active {
|
||||||
.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,
|
.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,
|
||||||
.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,
|
.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,
|
||||||
.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link {
|
.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link {
|
||||||
background-color: #912447;
|
background-color: #e6a632;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.navbar.is-info .navbar-dropdown a.navbar-item.is-active {
|
.navbar.is-info .navbar-dropdown a.navbar-item.is-active {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5679,14 +5679,14 @@ a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-i
|
||||||
color: hsl(229, 53%, 53%);
|
color: hsl(229, 53%, 53%);
|
||||||
}
|
}
|
||||||
.panel.is-info .panel-heading {
|
.panel.is-info .panel-heading {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.panel.is-info .panel-tabs a.is-active {
|
.panel.is-info .panel-tabs a.is-active {
|
||||||
border-bottom-color: #A52951;
|
border-bottom-color: #e9b049;
|
||||||
}
|
}
|
||||||
.panel.is-info .panel-block.is-active .panel-icon {
|
.panel.is-info .panel-block.is-active .panel-icon {
|
||||||
color: #A52951;
|
color: #e9b049;
|
||||||
}
|
}
|
||||||
.panel.is-success .panel-heading {
|
.panel.is-success .panel-heading {
|
||||||
background-color: hsl(153, 53%, 53%);
|
background-color: hsl(153, 53%, 53%);
|
||||||
|
@ -7802,39 +7802,39 @@ a.has-text-link-dark:hover, a.has-text-link-dark:focus {
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-text-info {
|
.has-text-info {
|
||||||
color: #A52951 !important;
|
color: #e9b049 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.has-text-info:hover, a.has-text-info:focus {
|
a.has-text-info:hover, a.has-text-info:focus {
|
||||||
color: #7c1f3d !important;
|
color: #e49c1c !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-background-info {
|
.has-background-info {
|
||||||
background-color: #A52951 !important;
|
background-color: #e9b049 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-text-info-light {
|
.has-text-info-light {
|
||||||
color: #fbeff3 !important;
|
color: #fdf7ed !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.has-text-info-light:hover, a.has-text-info-light:focus {
|
a.has-text-info-light:hover, a.has-text-info-light:focus {
|
||||||
color: #f1c6d4 !important;
|
color: #f7e3bf !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-background-info-light {
|
.has-background-info-light {
|
||||||
background-color: #fbeff3 !important;
|
background-color: #fdf7ed !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-text-info-dark {
|
.has-text-info-dark {
|
||||||
color: #cc3364 !important;
|
color: #845b10 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.has-text-info-dark:hover, a.has-text-info-dark:focus {
|
a.has-text-info-dark:hover, a.has-text-info-dark:focus {
|
||||||
color: #d65c83 !important;
|
color: #b17a15 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-background-info-dark {
|
.has-background-info-dark {
|
||||||
background-color: #cc3364 !important;
|
background-color: #845b10 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.has-text-success {
|
.has-text-success {
|
||||||
|
@ -9924,7 +9924,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.hero.is-info {
|
.hero.is-info {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),
|
.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),
|
||||||
|
@ -9943,7 +9943,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
|
||||||
}
|
}
|
||||||
@media screen and (max-width: 1023px) {
|
@media screen and (max-width: 1023px) {
|
||||||
.hero.is-info .navbar-menu {
|
.hero.is-info .navbar-menu {
|
||||||
background-color: #A52951;
|
background-color: #e9b049;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.hero.is-info .navbar-item,
|
.hero.is-info .navbar-item,
|
||||||
|
@ -9953,7 +9953,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
|
||||||
.hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active,
|
.hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active,
|
||||||
.hero.is-info .navbar-link:hover,
|
.hero.is-info .navbar-link:hover,
|
||||||
.hero.is-info .navbar-link.is-active {
|
.hero.is-info .navbar-link.is-active {
|
||||||
background-color: #912447;
|
background-color: #e6a632;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.hero.is-info .tabs a {
|
.hero.is-info .tabs a {
|
||||||
|
@ -9964,7 +9964,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
.hero.is-info .tabs li.is-active a {
|
.hero.is-info .tabs li.is-active a {
|
||||||
color: #A52951 !important;
|
color: #e9b049 !important;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a {
|
.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a {
|
||||||
|
@ -9976,14 +9976,14 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
|
||||||
.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover {
|
.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border-color: #fff;
|
border-color: #fff;
|
||||||
color: #A52951;
|
color: #e9b049;
|
||||||
}
|
}
|
||||||
.hero.is-info.is-bold {
|
.hero.is-info.is-bold {
|
||||||
background-image: linear-gradient(141deg, #84174c 0%, #A52951 71%, #bf2840 100%);
|
background-image: linear-gradient(141deg, #f07a0f 0%, #e9b049 71%, #f0d45b 100%);
|
||||||
}
|
}
|
||||||
@media screen and (max-width: 768px) {
|
@media screen and (max-width: 768px) {
|
||||||
.hero.is-info.is-bold .navbar-menu {
|
.hero.is-info.is-bold .navbar-menu {
|
||||||
background-image: linear-gradient(141deg, #84174c 0%, #A52951 71%, #bf2840 100%);
|
background-image: linear-gradient(141deg, #f07a0f 0%, #e9b049 71%, #f0d45b 100%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.hero.is-success {
|
.hero.is-success {
|
||||||
|
|
|
@ -4,7 +4,7 @@ $beige: #e9b049
|
||||||
$bright-black: #280a13
|
$bright-black: #280a13
|
||||||
|
|
||||||
$primary: $betterave
|
$primary: $betterave
|
||||||
$info: $betterave
|
$info: $beige
|
||||||
$text: $bright-black
|
$text: $bright-black
|
||||||
|
|
||||||
// Navbar
|
// Navbar
|
||||||
|
|
Loading…
Reference in a new issue