|
2 | 2 |
|
3 | 3 | from django import template
|
4 | 4 | from django.urls import reverse
|
| 5 | +from django.utils import timezone |
5 | 6 | from django.utils.html import format_html
|
6 | 7 | from unidecode import unidecode
|
7 | 8 |
|
@@ -91,10 +92,45 @@ def media_color(media_type):
|
91 | 92 | return models.Item.Colors[media_type.upper()].value
|
92 | 93 |
|
93 | 94 |
|
| 95 | +@register.filter |
| 96 | +def percentage_ratio(value, total): |
| 97 | + """Calculate percentage, showing one decimal place for values between 0 and 1.""" |
| 98 | + try: |
| 99 | + if total == 0: |
| 100 | + return "0" |
| 101 | + |
| 102 | + result = (Decimal(value) / Decimal(total)) * 100 |
| 103 | + |
| 104 | + # If result is between 0 and 1, show one decimal |
| 105 | + if 0 < result < 1: |
| 106 | + return f"{result:.1f}" |
| 107 | + |
| 108 | + # For all other values, show as integer |
| 109 | + return str(int(round(result))) |
| 110 | + except (TypeError, ValueError): |
| 111 | + return "0" |
| 112 | + |
| 113 | + |
| 114 | +@register.filter |
| 115 | +def naturalday(value): |
| 116 | + """Return the natural day for the date.""" |
| 117 | + today = timezone.now().date() |
| 118 | + diff = value - today |
| 119 | + days = diff.days |
| 120 | + days_threshold = 5 |
| 121 | + |
| 122 | + if days == 0: |
| 123 | + return "Today" |
| 124 | + if days == 1: |
| 125 | + return "Tomorrow" |
| 126 | + if days > 1 and days <= days_threshold: |
| 127 | + return f"In {days} days" |
| 128 | + return value.strftime("%b %d, %Y") |
| 129 | + |
| 130 | + |
94 | 131 | @register.filter
|
95 | 132 | def media_url(media):
|
96 | 133 | """Return the media URL for both metadata and model object cases."""
|
97 |
| - # Check if media is metadata or model instance |
98 | 134 | is_dict = isinstance(media, dict)
|
99 | 135 |
|
100 | 136 | # Get attributes using either dict access or object attribute
|
@@ -126,52 +162,55 @@ def media_url(media):
|
126 | 162 | )
|
127 | 163 |
|
128 | 164 |
|
129 |
| -@register.filter |
130 |
| -def percentage_ratio(value, total): |
131 |
| - """Calculate percentage, showing one decimal place for values between 0 and 1.""" |
132 |
| - try: |
133 |
| - if total == 0: |
134 |
| - return "0" |
135 |
| - |
136 |
| - result = (Decimal(value) / Decimal(total)) * 100 |
137 |
| - |
138 |
| - # If result is between 0 and 1, show one decimal |
139 |
| - if 0 < result < 1: |
140 |
| - return f"{result:.1f}" |
141 |
| - |
142 |
| - # For all other values, show as integer |
143 |
| - return str(int(round(result))) |
144 |
| - except (TypeError, ValueError): |
145 |
| - return "0" |
146 |
| - |
147 |
| - |
148 | 165 | @register.simple_tag
|
149 | 166 | def component_id(component_type, media):
|
150 |
| - """Return the component ID.""" |
151 |
| - component_id = f"{component_type}-{media['media_type']}-{media['media_id']}" |
| 167 | + """Return the component ID for both metadata and model object cases.""" |
| 168 | + is_dict = isinstance(media, dict) |
| 169 | + |
| 170 | + # Get base attributes using either dict access or object attribute |
| 171 | + media_type = media["media_type"] if is_dict else media.media_type |
| 172 | + media_id = media["media_id"] if is_dict else media.media_id |
| 173 | + |
| 174 | + component_id = f"{component_type}-{media_type}-{media_id}" |
152 | 175 |
|
153 |
| - if "season_number" in media: |
154 |
| - component_id += f"-{media['season_number']}" |
155 |
| - if "episode_number" in media: |
156 |
| - component_id += f"-{media['episode_number']}" |
| 176 | + # Handle season/episode numbers if they exist |
| 177 | + if is_dict: |
| 178 | + if "season_number" in media: |
| 179 | + component_id += f"-{media['season_number']}" |
| 180 | + if "episode_number" in media: |
| 181 | + component_id += f"-{media['episode_number']}" |
| 182 | + else: |
| 183 | + if media.season_number is not None: |
| 184 | + component_id += f"-{media.season_number}" |
| 185 | + if media.episode_number is not None: |
| 186 | + component_id += f"-{media.episode_number}" |
157 | 187 |
|
158 | 188 | return component_id
|
159 | 189 |
|
160 | 190 |
|
161 | 191 | @register.simple_tag
|
162 | 192 | def modal_url(modal_type, media):
|
163 |
| - """Return the modal URL.""" |
| 193 | + """Return the modal URL for both metadata and model object cases.""" |
| 194 | + is_dict = isinstance(media, dict) |
| 195 | + |
| 196 | + # Build kwargs using either dict access or object attribute |
164 | 197 | kwargs = {
|
165 |
| - "source": media["source"], |
166 |
| - "media_type": media["media_type"], |
167 |
| - "media_id": media["media_id"], |
| 198 | + "source": media["source"] if is_dict else media.source, |
| 199 | + "media_type": media["media_type"] if is_dict else media.media_type, |
| 200 | + "media_id": media["media_id"] if is_dict else media.media_id, |
168 | 201 | }
|
169 | 202 |
|
170 |
| - if "season_number" in media: |
171 |
| - kwargs["season_number"] = media["season_number"] |
172 |
| - |
173 |
| - if "episode_number" in media: |
174 |
| - kwargs["episode_number"] = media["episode_number"] |
| 203 | + # Handle season/episode numbers if they exist |
| 204 | + if is_dict: |
| 205 | + if "season_number" in media: |
| 206 | + kwargs["season_number"] = media["season_number"] |
| 207 | + if "episode_number" in media: |
| 208 | + kwargs["episode_number"] = media["episode_number"] |
| 209 | + else: |
| 210 | + if media.season_number is not None: |
| 211 | + kwargs["season_number"] = media.season_number |
| 212 | + if media.episode_number is not None: |
| 213 | + kwargs["episode_number"] = media.episode_number |
175 | 214 |
|
176 | 215 | return reverse(f"{modal_type}_modal", kwargs=kwargs)
|
177 | 216 |
|
|
0 commit comments