Compare commits
	
		
			1 Commits
		
	
	
		
			89d1bbdd9e
			...
			purchase_s
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a30c54ef44 | 
| @ -91,6 +91,7 @@ class PurchaseForm(forms.ModelForm): | |||||||
|             "date_purchased", |             "date_purchased", | ||||||
|             "date_refunded", |             "date_refunded", | ||||||
|             "date_finished", |             "date_finished", | ||||||
|  |             "status", | ||||||
|             "price", |             "price", | ||||||
|             "price_currency", |             "price_currency", | ||||||
|             "ownership_type", |             "ownership_type", | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								games/migrations/0034_purchase_status.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								games/migrations/0034_purchase_status.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | # Generated by Django 4.2.7 on 2023-12-22 10:07 | ||||||
|  |  | ||||||
|  | from django.db import migrations, models | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  |  | ||||||
|  |     dependencies = [ | ||||||
|  |         ("games", "0033_alter_edition_unique_together"), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name="purchase", | ||||||
|  |             name="status", | ||||||
|  |             field=models.IntegerField( | ||||||
|  |                 choices=[ | ||||||
|  |                     (0, "Unplayed"), | ||||||
|  |                     (1, "Playing"), | ||||||
|  |                     (2, "Dropped"), | ||||||
|  |                     (3, "Finished"), | ||||||
|  |                 ], | ||||||
|  |                 default=0, | ||||||
|  |             ), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
							
								
								
									
										22
									
								
								games/migrations/0035_auto_20231222_1109.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								games/migrations/0035_auto_20231222_1109.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | # Generated by Django 4.2.7 on 2023-12-22 10:09 | ||||||
|  |  | ||||||
|  | from django.db import migrations | ||||||
|  |  | ||||||
|  | from games.models import Purchase | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def set_default_state(apps, schema_editor): | ||||||
|  |     Purchase.objects.filter(session__isnull=False).update( | ||||||
|  |         status=Purchase.PurchaseState.PLAYING | ||||||
|  |     ) | ||||||
|  |     Purchase.objects.filter(date_finished__isnull=False).update( | ||||||
|  |         status=Purchase.PurchaseState.FINISHED | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  |     dependencies = [ | ||||||
|  |         ("games", "0034_purchase_status"), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     operations = [migrations.RunPython(set_default_state)] | ||||||
| @ -133,6 +133,25 @@ class Purchase(models.Model): | |||||||
|     ) |     ) | ||||||
|     created_at = models.DateTimeField(auto_now_add=True) |     created_at = models.DateTimeField(auto_now_add=True) | ||||||
|  |  | ||||||
|  |     class PurchaseState(models.IntegerChoices): | ||||||
|  |         UNPLAYED = ( | ||||||
|  |             0, | ||||||
|  |             "Unplayed", | ||||||
|  |         ) | ||||||
|  |         PLAYING = (1, "Playing") | ||||||
|  |         DROPPED = ( | ||||||
|  |             2, | ||||||
|  |             "Dropped", | ||||||
|  |         ) | ||||||
|  |         FINISHED = ( | ||||||
|  |             3, | ||||||
|  |             "Finished", | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |     status = models.IntegerField( | ||||||
|  |         choices=PurchaseState.choices, default=PurchaseState.UNPLAYED | ||||||
|  |     ) | ||||||
|  |  | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         additional_info = [ |         additional_info = [ | ||||||
|             self.get_type_display() if self.type != Purchase.GAME else "", |             self.get_type_display() if self.type != Purchase.GAME else "", | ||||||
|  | |||||||
| @ -137,6 +137,7 @@ | |||||||
|                 <tr> |                 <tr> | ||||||
|                     <th class="px-2 sm:px-4 md:px-6 md:py-2 purchase-name truncate max-w-20char">Name</th> |                     <th class="px-2 sm:px-4 md:px-6 md:py-2 purchase-name truncate max-w-20char">Name</th> | ||||||
|                     <th class="px-2 sm:px-4 md:px-6 md:py-2">Date</th> |                     <th class="px-2 sm:px-4 md:px-6 md:py-2">Date</th> | ||||||
|  |                     <th class="px-2 sm:px-4 md:px-6 md:py-2">Playtime</th> | ||||||
|                 </tr> |                 </tr> | ||||||
|             </thead> |             </thead> | ||||||
|             <tbody> |             <tbody> | ||||||
| @ -153,6 +154,7 @@ | |||||||
|                             </a> |                             </a> | ||||||
|                         </td> |                         </td> | ||||||
|                         <td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.date_finished | date:"d/m/Y" }}</td> |                         <td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.date_finished | date:"d/m/Y" }}</td> | ||||||
|  |                         <td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.formatted_playtime }}</td> | ||||||
|                     </tr> |                     </tr> | ||||||
|                 {% endfor %} |                 {% endfor %} | ||||||
|             </tbody> |             </tbody> | ||||||
|  | |||||||
| @ -371,6 +371,16 @@ def stats(request, year: int = 0): | |||||||
|     ) |     ) | ||||||
|  |  | ||||||
|     purchases_finished_this_year = Purchase.objects.filter(date_finished__year=year) |     purchases_finished_this_year = Purchase.objects.filter(date_finished__year=year) | ||||||
|  |     purchases_finished_this_year_with_playtime = purchases_finished_this_year.annotate( | ||||||
|  |         total_playtime=Sum( | ||||||
|  |             F("session__duration_calculated") + F("session__duration_manual") | ||||||
|  |         ) | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     for purchase in purchases_finished_this_year_with_playtime: | ||||||
|  |         formatted_playtime = format_duration(purchase.total_playtime, "%2.0H") | ||||||
|  |         setattr(purchase, "formatted_playtime", formatted_playtime) | ||||||
|  |  | ||||||
|     purchases_finished_this_year_released_this_year = ( |     purchases_finished_this_year_released_this_year = ( | ||||||
|         purchases_finished_this_year.filter(edition__year_released=year).order_by( |         purchases_finished_this_year.filter(edition__year_released=year).order_by( | ||||||
|             "date_finished" |             "date_finished" | ||||||
| @ -442,7 +452,7 @@ def stats(request, year: int = 0): | |||||||
|         "spent_per_game": int( |         "spent_per_game": int( | ||||||
|             safe_division(total_spent, this_year_purchases_without_refunded.count()) |             safe_division(total_spent, this_year_purchases_without_refunded.count()) | ||||||
|         ), |         ), | ||||||
|         "all_finished_this_year": purchases_finished_this_year.order_by( |         "all_finished_this_year": purchases_finished_this_year_with_playtime.order_by( | ||||||
|             "date_finished" |             "date_finished" | ||||||
|         ), |         ), | ||||||
|         "this_year_finished_this_year": purchases_finished_this_year_released_this_year.order_by( |         "this_year_finished_this_year": purchases_finished_this_year_released_this_year.order_by( | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user