mirror of
				https://github.com/ae-utbm/sith.git
				synced 2025-10-31 00:53:08 +00:00 
			
		
		
		
	| @@ -184,9 +184,7 @@ | ||||
|               </div> | ||||
|               <a href="{{ url('forum:main') }}">{% trans %}Forum{% endtrans %}</a> | ||||
|               <a href="{{ url('sas:main') }}">{% trans %}Gallery{% endtrans %}</a> | ||||
|               {% if request.user.is_authenticated %} | ||||
|                   <a href="{{ url('eboutic:main') }}">{% trans %}Eboutic{% endtrans %}</a> | ||||
|               {% endif %} | ||||
|               <a href="{{ url('eboutic:main') }}">{% trans %}Eboutic{% endtrans %}</a> | ||||
|               <div class="dropdown"> | ||||
|                 <button class="dropbtn">{% trans %}Services{% endtrans %} | ||||
|                 <i class="fa fa-caret-down"></i> | ||||
|   | ||||
							
								
								
									
										18
									
								
								counter/migrations/0018_producttype_priority.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								counter/migrations/0018_producttype_priority.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| # Generated by Django 3.2.15 on 2022-11-16 18:35 | ||||
|  | ||||
| from django.db import migrations, models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|  | ||||
|     dependencies = [ | ||||
|         ("counter", "0017_studentcard"), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.AddField( | ||||
|             model_name="producttype", | ||||
|             name="priority", | ||||
|             field=models.PositiveIntegerField(default=0), | ||||
|         ), | ||||
|     ] | ||||
| @@ -133,8 +133,13 @@ class ProductType(models.Model): | ||||
|     comment = models.TextField(_("comment"), null=True, blank=True) | ||||
|     icon = models.ImageField(upload_to="products", null=True, blank=True) | ||||
|  | ||||
|     # priority holds no real backend logic but helps to handle the order in which | ||||
|     # the items are to be shown to the user | ||||
|     priority = models.PositiveIntegerField(default=0) | ||||
|  | ||||
|     class Meta: | ||||
|         verbose_name = _("product type") | ||||
|         ordering = ["-priority", "name"] | ||||
|  | ||||
|     def is_owned_by(self, user): | ||||
|         """ | ||||
|   | ||||
| @@ -954,7 +954,7 @@ class ProductTypeCreateView(CounterAdminTabsMixin, CounterAdminMixin, CreateView | ||||
|     """ | ||||
|  | ||||
|     model = ProductType | ||||
|     fields = ["name", "description", "comment", "icon"] | ||||
|     fields = ["name", "description", "comment", "icon", "priority"] | ||||
|     template_name = "core/create.jinja" | ||||
|     current_tab = "products" | ||||
|  | ||||
| @@ -966,7 +966,7 @@ class ProductTypeEditView(CounterAdminTabsMixin, CounterAdminMixin, UpdateView): | ||||
|  | ||||
|     model = ProductType | ||||
|     template_name = "core/edit.jinja" | ||||
|     fields = ["name", "description", "comment", "icon"] | ||||
|     fields = ["name", "description", "comment", "icon", "priority"] | ||||
|     pk_url_kwarg = "type_id" | ||||
|     current_tab = "products" | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,9 @@ def get_eboutic_products(user: User) -> List[Product]: | ||||
|         .products.filter(product_type__isnull=False) | ||||
|         .filter(archived=False) | ||||
|         .filter(limit_age__lte=user.age) | ||||
|         .annotate(priority=F("product_type__priority")) | ||||
|         .annotate(category=F("product_type__name")) | ||||
|         .annotate(category_comment=F("product_type__comment")) | ||||
|     ) | ||||
|     return [p for p in products if p.can_be_sold_to(user)] | ||||
|  | ||||
|   | ||||
| @@ -23,56 +23,56 @@ | ||||
|     <h1 id="eboutic-title">{% trans %}Eboutic{% endtrans %}</h1> | ||||
|     <div id="eboutic" x-data="basket"> | ||||
|         <div id="basket"> | ||||
|                 <h3>Panier</h3> | ||||
|                 {% if errors %} | ||||
|                     <div class="error-message"> | ||||
|                         {% for error in errors %} | ||||
|                             <p>{{ error }}</p> | ||||
|                         {% endfor %} | ||||
|             <h3>Panier</h3> | ||||
|             {% if errors %} | ||||
|                 <div class="error-message"> | ||||
|                     {% for error in errors %} | ||||
|                         <p>{{ error }}</p> | ||||
|                     {% endfor %} | ||||
|                     {% trans %}Your basket has been cleaned accordingly to those errors.{% endtrans %} | ||||
|                     </div> | ||||
|                 {% endif %} | ||||
|                 <ul class="item-list"> | ||||
|                     {# Starting money #} | ||||
|                     <li> | ||||
|                         <span class="item-name"> | ||||
|                             <strong>{% trans %}Current account amount: {% endtrans %}</strong> | ||||
|                         </span> | ||||
|                         <span class="item-price"> | ||||
|                             <strong>{{ "%0.2f"|format(customer_amount) }} €</strong> | ||||
|                         </span> | ||||
|                     </li> | ||||
|                     <template x-for="item in items" :key="item.id"> | ||||
|                         <li class="item-row" x-show="item.quantity > 0"> | ||||
|                             <span class="item-name" x-text="item.name"></span> | ||||
|                             <div class="item-quantity"> | ||||
|                                 <i class="fa fa-minus fa-xs" @click="remove(item.id)"></i> | ||||
|                                 <span x-text="item.quantity"></span> | ||||
|                                 <i class="fa fa-plus" @click="add(item)"></i> | ||||
|                             </div> | ||||
|                             <span class="item-price" x-text="(item.unit_price * item.quantity).toFixed(2) + ' €'"></span> | ||||
|                         </li> | ||||
|                     </template> | ||||
|                     {# Total price #} | ||||
|                     <li style="margin-top: 20px"> | ||||
|                         <span class="item-name"><strong>{% trans %}Basket amount: {% endtrans %}</strong></span> | ||||
|                         <span x-text="get_total().toFixed(2) + ' €'" class="item-price"></span> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|                 <div class="catalog-buttons"> | ||||
|                     <button @click="clear_basket()" class="clear"> | ||||
|                         <i class="fa fa-trash"></i> | ||||
|                         {% trans %}Clear{% endtrans %} | ||||
|                     </button> | ||||
|                     <form method="post" action="{{ url('eboutic:command') }}"> | ||||
|                         {% csrf_token %} | ||||
|                         <button class="validate"> | ||||
|                             <i class="fa fa-check"></i> | ||||
|                             <input type="submit" value="{% trans %}Validate{% endtrans %}"/> | ||||
|                         </button> | ||||
|                     </form> | ||||
|                 </div> | ||||
|             {% endif %} | ||||
|             <ul class="item-list"> | ||||
|                 {# Starting money #} | ||||
|                 <li> | ||||
|                     <span class="item-name"> | ||||
|                         <strong>{% trans %}Current account amount: {% endtrans %}</strong> | ||||
|                     </span> | ||||
|                     <span class="item-price"> | ||||
|                         <strong>{{ "%0.2f"|format(customer_amount) }} €</strong> | ||||
|                     </span> | ||||
|                 </li> | ||||
|                 <template x-for="item in items" :key="item.id"> | ||||
|                     <li class="item-row" x-show="item.quantity > 0"> | ||||
|                         <span class="item-name" x-text="item.name"></span> | ||||
|                         <div class="item-quantity"> | ||||
|                             <i class="fa fa-minus fa-xs" @click="remove(item.id)"></i> | ||||
|                             <span x-text="item.quantity"></span> | ||||
|                             <i class="fa fa-plus" @click="add(item)"></i> | ||||
|                         </div> | ||||
|                         <span class="item-price" x-text="(item.unit_price * item.quantity).toFixed(2) + ' €'"></span> | ||||
|                     </li> | ||||
|                 </template> | ||||
|                 {# Total price #} | ||||
|                 <li style="margin-top: 20px"> | ||||
|                     <span class="item-name"><strong>{% trans %}Basket amount: {% endtrans %}</strong></span> | ||||
|                     <span x-text="get_total().toFixed(2) + ' €'" class="item-price"></span> | ||||
|                 </li> | ||||
|             </ul> | ||||
|             <div class="catalog-buttons"> | ||||
|                 <button @click="clear_basket()" class="clear"> | ||||
|                     <i class="fa fa-trash"></i> | ||||
|                     {% trans %}Clear{% endtrans %} | ||||
|                 </button> | ||||
|                 <form method="post" action="{{ url('eboutic:command') }}"> | ||||
|                     {% csrf_token %} | ||||
|                     <button class="validate"> | ||||
|                         <i class="fa fa-check"></i> | ||||
|                         <input type="submit" value="{% trans %}Validate{% endtrans %}"/> | ||||
|                     </button> | ||||
|                 </form> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div id="catalog"> | ||||
|             {% if not request.user.date_of_birth %} | ||||
|                 <div class="alert" x-data="{show_alert: true}" x-show="show_alert" x-transition> | ||||
| @@ -88,35 +88,37 @@ | ||||
|                 </div> | ||||
|             {% endif %} | ||||
|  | ||||
|             {% for category, items in products|groupby('category') %} | ||||
|                 {% if items|count > 0 %} | ||||
|                     <section> | ||||
|                         {# I would have wholeheartedly directly used the header element instead | ||||
|                         but it has already been made messy in core/style.scss #} | ||||
|                         <div class="category-header"> | ||||
|                             <h3>{{ category }}</h3> | ||||
|                             {% if category.comment %} | ||||
|                                 <p>{{ category.comment }}</p> | ||||
|                             {% endif %} | ||||
|                         </div> | ||||
|                         <div class="product-group"> | ||||
|                             {% for p in items %} | ||||
|                                 <button class="product-button" | ||||
|                                         @click='add_from_catalog({{ p.id }}, {{ p.name|tojson }}, {{ p.selling_price }})'> | ||||
|                                     {% if p.icon %} | ||||
|                                         <img src="{{ p.icon.url }}" alt="image de {{ p.name }}" | ||||
|                                              width="40px" height="40px"> | ||||
|                                     {% else %} | ||||
|                                         <i class="fa fa-2x fa-picture-o"></i> | ||||
|                                     {% endif %} | ||||
|                                     <p><strong>{{ p.name }}</strong></p> | ||||
|                                     <p>{{ p.selling_price }} €</p> | ||||
|                                 </button> | ||||
|                             {% endfor %} | ||||
|                         </div> | ||||
|                     </section> | ||||
|                 {% endif %} | ||||
|                 {% else %} | ||||
|             {% for priority_groups in products|groupby('priority')|reverse %} | ||||
|                 {% for category, items in priority_groups.list|groupby('category') %} | ||||
|                     {% if items|count > 0 %} | ||||
|                         <section> | ||||
|                             {# I would have wholeheartedly directly used the header element instead | ||||
|                             but it has already been made messy in core/style.scss #} | ||||
|                             <div class="category-header"> | ||||
|                                 <h3>{{ category }}</h3> | ||||
|                                 {% if items[0].category_comment %} | ||||
|                                     <p><i>{{ items[0].category_comment }}</i></p> | ||||
|                                 {% endif %} | ||||
|                             </div> | ||||
|                             <div class="product-group"> | ||||
|                                 {% for p in items %} | ||||
|                                     <button class="product-button" | ||||
|                                             @click='add_from_catalog({{ p.id }}, {{ p.name|tojson }}, {{ p.selling_price }})'> | ||||
|                                         {% if p.icon %} | ||||
|                                             <img src="{{ p.icon.url }}" alt="image de {{ p.name }}" | ||||
|                                                  width="40px" height="40px"> | ||||
|                                         {% else %} | ||||
|                                             <i class="fa fa-2x fa-picture-o"></i> | ||||
|                                         {% endif %} | ||||
|                                         <p><strong>{{ p.name }}</strong></p> | ||||
|                                         <p>{{ p.selling_price }} €</p> | ||||
|                                     </button> | ||||
|                                 {% endfor %} | ||||
|                             </div> | ||||
|                         </section> | ||||
|                     {% endif %} | ||||
|                 {% endfor %} | ||||
|             {% else %} | ||||
|                 <p>{% trans %}There are no items available for sale{% endtrans %}</p> | ||||
|             {% endfor %} | ||||
|         </div> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user