]> git.lizzy.rs Git - cheatdb.git/blob - app/templates/packages/view.html
Add nofollow to tags
[cheatdb.git] / app / templates / packages / view.html
1 {% set query=package.name %}
2
3 {% extends "base.html" %}
4
5 {% block title %}
6         {{ package.title }}
7 {% endblock %}
8
9 {% block headextra %}
10         <meta name="og:title" content="{{ package.title }}"/>
11         <meta name="og:description" content="{{ package.short_desc }}"/>
12         <meta name="description" content="{{ package.short_desc }}"/>
13         <meta name="og:url" content="{{ package.getDetailsURL(absolute=True) }}"/>
14         {% if package.getMainScreenshotURL() %}
15         <meta name="og:image" content="{{ package.getMainScreenshotURL(absolute=True) }}"/>
16         {% endif %}
17 {% endblock %}
18
19 {% block container %}
20         {% if not package.license.is_foss and not package.media_license.is_foss and package.type != package.type.TXP  %}
21                 {% set package_warning="Non-free code and media" %}
22         {% elif not package.license.is_foss and package.type != package.type.TXP %}
23                 {% set package_warning="Non-free code" %}
24         {% elif not package.media_license.is_foss %}
25                 {% set package_warning="Non-free media" %}
26         {% endif %}
27         {% set release = package.getDownloadRelease() %}
28
29         <header class="jumbotron pb-3"
30                 style="background: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.7)), url('{{ package.getMainScreenshotURL() }}');
31                         background-size: cover;
32                         background-repeat: no-repeat;
33                         background-position: center;">
34                 <div class="container">
35                         <h1 class="display-3">
36                                 {{ package.title }}
37                         </h1>
38
39                         <p class="lead">
40                                 {{ package.short_desc }}
41                         </p>
42
43                         <p>
44                                 {% if package_warning %}
45                                         <a class="badge badge-danger" href="/help/non_free/">
46                                                 <i class="fas fa-exclamation-circle" style="margin-right: 0.3em;"></i>
47                                                 {{ package_warning }}
48                                         </a>
49                                 {% endif %}
50                                 {% for t in package.tags %}
51                                         <a class="badge badge-primary" rel="nofollow"
52                                                 href="{{ url_for('packages.list_all', tag=t.name) }}">{{ t.title }}</a>
53                                 {% endfor %}
54                         </p>
55
56                         <div class="info-row row" style="margin-top: 2rem;">
57                                 <div class="btn-group-horizontal col">
58                                         <a class="btn" href="{{ url_for('users.profile', username=package.author.username) }}">
59                                                 <i class="fas fa-user"></i>
60                                                 <span class="count">
61                                                         {{ package.author.display_name }}
62                                                 </span>
63                                         </a>
64                                         <a class="btn" rel="nofollow" href="{{ package.getDownloadURL() }}">
65                                                 <i class="fas fa-download"></i>
66                                                 <span class="count">{{ package.downloads }}</span>
67                                         </a>
68                                         <a class="btn" href="{{ url_for('threads.list_all', pid=package.id) }}">
69                                                 <i class="fas fa-comment-alt"></i>
70                                                 <span class="count">{{ threads | length }}</span>
71                                         </a>
72                                         {% if package.website %}
73                                                 <a class="btn" href="{{ package.website }}">
74                                                         <i class="fas fa-globe-europe"></i>
75                                                         <span class="count">{{ _("Website") }}</span>
76                                                 </a>
77                                         {% endif %}
78                                         {% if package.repo %}
79                                                 <a class="btn" href="{{ package.repo }}">
80                                                         <i class="fas fa-code"></i>
81                                                         <span class="count">{{ _("Source") }}</span>
82                                                 </a>
83                                         {% endif %}
84                                         {% if package.forums %}
85                                                 <a class="btn" href="https://forum.minetest.net/viewtopic.php?t={{ package.forums }}">
86                                                         <i class="fas fa-comments"></i>
87                                                         <span class="count">{{ _("Forums") }}</span>
88                                                 </a>
89                                         {% endif %}
90                                         {% if package.issueTracker %}
91                                                 <a class="btn" href="{{ package.issueTracker }}">
92                                                         <i class="fas fa-bug"></i>
93                                                         <span class="count">{{ _("Issue Tracker") }}</span>
94                                                 </a>
95                                         {% endif %}
96                                 </div>
97                                 {% if release and (release.min_rel or release.max_rel) %}
98                                         <div class="btn col-md-auto">
99                                                 <img src="https://www.minetest.net/media/icon.svg" style="max-height: 1.2em;">
100                                                 <span class="count">
101                                                         {% if release.min_rel and release.max_rel %}
102                                                                 {{ _("%(min)s - %(max)s", min=release.min_rel.name, max=release.max_rel.name) }}
103                                                         {% elif release.min_rel %}
104                                                                 {{ _("%(min)s and above", min=release.min_rel.name) }}
105                                                         {% elif release.max_rel %}
106                                                                 {{ _("%(max)s and below", max=release.max_rel.name) }}
107                                                         {% endif %}
108                                                 </span>
109                                         </div>
110                                 {% endif %}
111                                 <div class="btn-group-horizontal col-md-auto">
112                                         {% if release %}
113                                                 <a class="btn btn-download btn_green" rel="nofollow"
114                                                                 href="{{ package.getDownloadURL() }}">
115                                                         {{ _("Download") }}
116                                                 </a>
117                                         {% else %}
118                                                 <i>
119                                                         {{ _("No downloads available") }}
120                                                 </i>
121                                         {% endif %}
122                                 </div>
123                         </div>
124                 </div>
125         </header>
126
127         <main class="container mt-4">
128                 {% if not package.approved %}
129                         <div class="alert alert-warning">
130                                 <span class="icon_message"></span>
131                                 {% if package.releases.count() == 0 %}
132                                         <h4 class="alert-heading">Release Required</h4>
133                                         {% if package.checkPerm(current_user, "MAKE_RELEASE") %}
134                                                 <p>You need to create a release before this package can be approved.</p>
135                                                 <p>
136                                                         A release is a single downloadable version of your {{ package.type.value | lower }}.
137                                                         You need to create releases even if you use a rolling release development cycle,
138                                                         as Minetest needs them to check for updates.
139                                                 </p>
140                                                 <a class="btn" href="{{ package.getCreateReleaseURL() }}">Create Release</a>
141                                         {% else %}
142                                                 A release is required before this package can be approved.
143                                         {% endif %}
144
145                                 {% elif (package.type == package.type.GAME or package.type == package.type.TXP) and package.screenshots.count() == 0 %}
146                                         You need to add at least one screenshot.
147
148                                 {% elif topic_error_lvl == "danger" %}
149                                         Please fix the below topic issue(s).
150
151                                 {% elif "Other" in package.license.name or "Other" in package.media_license.name %}
152                                         Please wait for the license to be added to CDB.
153
154                                 {% else %}
155                                         {% if package.screenshots.count() == 0 %}
156                                                 <b>You should add at least one screenshot, but this isn't required.</b><br />
157                                         {% endif %}
158
159                                         {% if not package.getDownloadRelease() %}
160                                                 Please wait for the release to be approved.
161                                         {% elif package.checkPerm(current_user, "APPROVE_NEW") %}
162                                                 <form class="float-right"  method="post" action="{{ package.getApproveURL() }}">
163                                                         <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
164                                                         <input class="btn btn-sm btn-warning" type="submit" value="Approve" />
165                                                 </form>
166                                                 You can now approve this package if you're ready.
167                                         {% else %}
168                                                 Please wait for the package to be approved.
169                                         {% endif %}
170                                 {% endif %}
171                                 <div style="clear: both;"></div>
172                         </div>
173
174                         {% if topic_error %}
175                                 <div class="alert alert-{{ topic_error_lvl }}">
176                                         <span class="icon_message"></span>
177                                         {{ topic_error | safe }}
178                                         <div style="clear: both;"></div>
179                                 </div>
180                         {% endif %}
181
182                         {% if similar_topics %}
183                                 <div class="alert alert-warning">
184                                         Please make sure that this package has the right to
185                                         the name '{{ package.name }}'.
186                                         See the
187                                         <a href="/policy_and_guidance/">Inclusion Policy</a>
188                                         for more info.
189                                 </div>
190                         {% endif %}
191
192                         {% if not review_thread and (package.author == current_user or package.checkPerm(current_user, "APPROVE_NEW")) %}
193                                 <div class="alert alert-info">
194                                         <a class="float-right btn btn-sm btn-info" href="{{ url_for('threads.new', pid=package.id, title='Package approval comments') }}">Open Thread</a>
195
196                                         Privately ask a question or give feedback
197                                         <div style="clear:both;"></div>
198                                 </div>
199                         {% endif %}
200                 {% endif %}
201
202                 <aside class="float-right ml-4" style="width: 18rem;">
203                         <div class="card mb-4">
204                                 <div class="card-header">
205                                         Details
206                                         <div class="btn-group float-right">
207                                         {% if package.checkPerm(current_user, "EDIT_PACKAGE") %}
208                                                 <a class="btn btn-primary btn-sm ml-1" href="{{ package.getEditURL() }}"><i class="fas fa-edit"></i></a>
209                                         {% endif %}
210                                         {# {% if current_user.is_authenticated %}
211                                                 <a class="btn btn-primary btn-sm ml-1" href="{{ package.getCreateEditRequestURL() }}">Suggest Changes</a>
212                                         {% endif %} #}
213                                         {% if package.checkPerm(current_user, "DELETE_PACKAGE") or package.checkPerm(current_user, "UNAPPROVE_PACKAGE") %}
214                                                 <a class="btn btn-danger btn-sm ml-1" href="{{ package.getRemoveURL() }}"><i class="fas fa-trash"></i></a>
215                                         {% endif %}
216                                         </div>
217                                 </div>
218
219                                 {% if package_warning %}
220                                         <div class="card-body">
221                                                 <div class="alert alert-danger">
222                                                         <a href="/help/non_free/" class="float-right">Info</a>
223                                                         <b>Warning:</b> {{ package_warning }}
224                                                 </div>
225                                         </div>
226                                 {% endif %}
227                                 <table class="table">
228                                         <tr>
229                                                 <td>Type</td>
230                                                 <td>{{ package.type.value }}</td>
231                                         </tr>
232                                         <tr>
233                                                 <td>Name</td>
234                                                 <td>{{ package.name }}</td>
235                                         </tr>
236                                         {% if package.provides %}
237                                         <tr>
238                                                 <td>Provides</td>
239                                                 <td>{% for meta in package.provides %}
240                                                         <a class="badge badge-primary"
241                                                          href="{{ url_for('metapackages.view', name=meta.name) }}">{{ meta.name }}</a>
242                                                 {% endfor %}</td>
243                                         </tr>
244                                         {% endif %}
245                                         <tr>
246                                                 <td>License</td>
247                                                 <td>
248                                                         {% if package.license == package.media_license %}
249                                                                 {{ package.license.name }}
250                                                         {% elif package.type == package.type.TXP %}
251                                                                 {{ package.media_license.name }}
252                                                         {% else %}
253                                                                 {{ package.license.name }} for code,<br />
254                                                                 {{ package.media_license.name }} for media.
255                                                         {% endif %}
256                                                 </td>
257                                         </tr>
258                                         <tr>
259                                                 <td>Added</td>
260                                                 <td>{{ package.created_at | datetime }}</td>
261                                         </tr>
262                                         <tr>
263                                                 <td>Maintainers</td>
264                                                 <td>
265                                                         {% if package.checkPerm(current_user, "EDIT_MAINTAINERS") %}
266                                                                 <a class="btn btn-primary btn-sm ml-1 float-right" href="{{ package.getEditMaintainersURL() }}"><i class="fas fa-edit"></i></a>
267                                                         {% endif %}
268
269                                                         {% for user in package.maintainers %}
270                                                                 <a class="badge badge-primary"
271                                                                         href="{{ url_for('users.profile', username=user.username) }}">
272                                                                         {{ user.display_name }}
273                                                                 </a>
274                                                         {% endfor %}
275
276                                                         {% if current_user in package.maintainers and current_user != package.author %}
277                                                                 <form class="mt-2"  method="post" action="{{ package.getRemoveSelfMaintainerURL() }}">
278                                                                         <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
279                                                                         <input class="btn btn-sm btn-link p-0" type="submit" value="{{ _("Remove myself") }}" />
280                                                                 </form>
281                                                         {% endif %}
282                                                 </td>
283                                         </tr>
284                                 </table>
285                         </div>
286
287                         {% if package.author.donate_url %}
288                                 <div class="alert alert-secondary">
289                                         Like {{ package.author.display_name }}'s work?
290                                         <a href="{{ package.author.donate_url }}" rel="nofollow">Donate now!</a>
291                                 </div>
292                         {% endif %}
293
294                         {% if package.type == package.type.MOD %}
295                                 <div class="card my-4">
296                                         <div class="card-header">Dependencies</div>
297                                         <div class="card-body">
298                                                 <div class="card-subtitle mb-2 text-muted">{{ _("Required") }}</div>
299                                                 {% for dep in package.getSortedHardDependencies() %}
300                                                         {%- if dep.package %}
301                                                                 <div                                    </div class="badge badge-primary"
302                                                                                 href="{{ dep.package.getDetailsURL() }}">
303                                                                         {{ dep.package.title }} by {{ dep.package.author.display_name }}
304                                                         {% elif dep.meta_package %}
305                                                                 <a class="badge badge-primary"
306                                                                                 href="{{ url_for('metapackages.view', name=dep.meta_package.name) }}">
307                                                                         {{ dep.meta_package.name }}
308                                                         {% else %}
309                                                                 {{ "Excepted package or meta_package in dep!" | throw }}
310                                                         {% endif %}</a>
311                                                 {% else %}
312                                                         <i>No required dependencies</i>
313                                                 {% endfor %}
314
315                                                 {% set optional_deps=package.getSortedOptionalDependencies() %}
316                                                 {% if optional_deps %}
317                                                 <div class="card-subtitle my-2 text-muted">{{ _("Optional") }}</div>
318                                                         {% for dep in optional_deps %}
319                                                                 {%- if dep.package %}
320                                                                         <a class="badge badge-secondary"
321                                                                                         href="{{ dep.package.getDetailsURL() }}">
322                                                                                 {{ dep.package.title }} by {{ dep.package.author.display_name }}
323                                                                 {% elif dep.meta_package %}
324                                                                         <a class="badge badge-secondary"
325                                                                                         href="{{ url_for('metapackages.view', name=dep.meta_package.name) }}">
326                                                                                 {{ dep.meta_package.name }}
327                                                                 {% else %}
328                                                                         {{ "Excepted package or meta_package in dep!" | throw }}
329                                                                 {% endif %}</a>
330                                                         {% endfor %}
331                                                 {% endif %}
332                                         </div>
333                                 </div>
334                         {% endif %}
335
336                         <div class="card my-4">
337                                 <div class="card-header">
338                                         Releases
339                                         {% if package.checkPerm(current_user, "MAKE_RELEASE") %}
340                                                 <div class="btn-group float-right">
341                                                         <a class="btn btn-primary btn-sm ml-1" href="{{ package.getBulkReleaseURL() }}">
342                                                                 <i class="fas fa-wrench"></i>
343                                                                 {{ _("Bulk") }}
344                                                         </a>
345                                                         <a class="btn btn-primary btn-sm ml-1" href="{{ package.getCreateReleaseURL() }}"><i class="fas fa-plus"></i></a>
346                                                 </div>
347                                         {% endif %}
348                                 </div>
349                                 <ul class="list-group list-group-flush">
350                                         {% for rel in releases %}
351                                                 {% if rel.approved or package.checkPerm(current_user, "MAKE_RELEASE") or package.checkPerm(current_user, "APPROVE_RELEASE")  %}
352                                                         <li class="list-group-item">
353
354                                                                 {% if package.checkPerm(current_user, "MAKE_RELEASE") or package.checkPerm(current_user, "APPROVE_RELEASE")  %}
355                                                                         <a class="btn btn-sm btn-primary float-right" href="{{ rel.getEditURL() }}">Edit
356                                                                         {% if not rel.task_id and not rel.approved and package.checkPerm(current_user, "APPROVE_RELEASE") %}
357                                                                                 / Approve
358                                                                         {% endif %}
359                                                                         </a>
360                                                                 {% endif %}
361
362                                                                 {% if not rel.approved %}<i>{% endif %}
363
364                                                                 <a href="{{ rel.getDownloadURL() }}" rel="nofollow">{{ rel.title }}</a>
365
366                                                                 <span style="color:#ddd;">
367                                                                         {% if rel.min_rel and rel.max_rel %}
368                                                                                 [MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}]
369                                                                         {% elif rel.min_rel %}
370                                                                                 [MT {{ rel.min_rel.name }}+]
371                                                                         {% elif rel.max_rel %}
372                                                                                 [MT &le;{{ rel.max_rel.name }}]
373                                                                         {% endif %}
374                                                                 </span>
375
376                                                                 <br>
377
378                                                                 <small style="color:#999;">
379                                                                         {% if rel.commit_hash %}
380                                                                                         [{{ rel.commit_hash | truncate(5, end='') }}]
381                                                                         {% endif %}
382
383                                                                         created {{ rel.releaseDate | date }}.
384                                                                 </small>
385                                                                 {% if (package.checkPerm(current_user, "MAKE_RELEASE") or package.checkPerm(current_user, "APPROVE_RELEASE")) and rel.task_id %}
386                                                                         <a href="{{ url_for('tasks.check', id=rel.task_id, r=package.getDetailsURL()) }}">Importing...</a>
387                                                                 {% elif not rel.approved %}
388                                                                         Waiting for approval.
389                                                                 {% endif %}
390
391                                                                 {% if not rel.approved %}</i>{% endif %}
392
393                                                         </li>
394                                                 {% endif %}
395                                         {% else %}
396                                                 <li class="list-group-item">No releases available.</li>
397                                         {% endfor %}
398                                 </ul>
399                         </div>
400
401                         <div class="card my-4">
402                                 <div class="card-header">
403                                         {% if package.approved and package.checkPerm(current_user, "CREATE_THREAD") %}
404                                                 <div class="btn-group float-right">
405                                                         <a class="btn btn-primary btn-sm mx-1" href="{{ url_for('threads.new', pid=package.id) }}"><i class="fas fa-plus"></i></a>
406                                                 </div>
407                                         {% endif %}
408                                         Threads
409                                 </div>
410                                 <ul class="list-group list-group-flush">
411                                         {% from "macros/threads.html" import render_threadlist %}
412                                         {{ render_threadlist(threads, compact=True) }}
413                                 </ul>
414                         </div>
415
416                         {% if package.approved and package.checkPerm(current_user, "CREATE_THREAD") and current_user != package.author and not current_user.rank.atLeast(current_user.rank.EDITOR) %}
417                                 <a class="float-right"
418                                         href="{{ url_for('threads.new', pid=package.id) }}">
419                                                 Report a problem with this listing
420                                 </a>
421                         {% endif %}
422                 </aside>
423
424                 {% if not package.approved and (package.author == current_user or package.checkPerm(current_user, "APPROVE_NEW")) %}
425                         {% if review_thread %}
426                                 <h2>{% if review_thread.private %}&#x1f512;{% endif %} {{ review_thread.title }}</h2>
427                                 {% if review_thread.private %}
428                                         <p><i>
429                                                 This thread is only visible to the package owner and users of
430                                                 Editor rank or above.
431                                         </i></p>
432                                 {% endif %}
433
434                                 {% from "macros/threads.html" import render_thread %}
435                                 {{ render_thread(review_thread, current_user) }}
436                         {% endif %}
437                 {% endif %}
438
439                 <ul class="screenshot_list mb-4">
440                         {% for ss in package.screenshots %}
441                                 {% if ss.approved or package.checkPerm(current_user, "ADD_SCREENSHOTS") %}
442                                         <li>
443                                                 <a href="{% if package.checkPerm(current_user, 'ADD_SCREENSHOTS') %}{{ ss.getEditURL() }}{% else %}{{ ss.url }}{% endif %}">
444                                                         <img src="{{ ss.getThumbnailURL() }}" alt="{{ ss.title }}" />
445                                                 </a>
446                                         </li>
447                                 {% endif %}
448                         {% endfor %}
449                         {% if package.checkPerm(current_user, "EDIT_PACKAGE") %}
450                                 <li>
451                                         <a href="{{ package.getNewScreenshotURL() }}">
452                                                 <div class="fas fa-plus screenshot-add"></div>
453                                         </a>
454                                 </li>
455                         {% endif %}
456                 </ul>
457
458                 {{ package.desc | markdown }}
459
460                 <div style="clear: both;"></div>
461
462                 <h3>Ratings and Reviews</h3>
463
464                 {% from "macros/reviews.html" import render_reviews, render_review_form, render_review_preview %}
465                 {% if current_user.is_authenticated %}
466                         {% if has_review %}
467                                 <p>
468                                         <a class="btn btn-primary" href="{{ package.getReviewURL() }}">
469                                                 {{ _("Edit Review") }}
470                                         </a>
471                                 </p>
472                         {% elif current_user in package.maintainers %}
473                                 <p>
474                                         {{ _("You can't review your own package.") }}
475                                 </p>
476                         {% else %}
477                                 {{ render_review_preview(package) }}
478                         {% endif %}
479                 {% else %}
480                         {{ render_review_preview(package) }}
481                 {% endif %}
482                 {{ render_reviews(package.reviews, current_user) }}
483
484                 {#
485                         {% if current_user.is_authenticated or requests %}
486                                 <h3>Edit Requests</h3>
487
488                                 <ul>
489                                         {% for r in requests %}
490                                                 <li>
491                                                         <a href="{{ r.getURL() }}">{{ r.title }}</a>
492                                                         by
493                                                         <a href="{{ url_for('users.profile', username=r.author.username) }}">{{ r.author.display_name }}</a>
494                                                 </li>
495                                         {% else %}
496                                                 <li>No edit requests have been made.</li>
497                                         {% endfor %}
498                                 </ul>
499                         {% endif %}
500                 #}
501
502                 {% if alternatives %}
503                         <h3>Related</h3>
504
505                         {% from "macros/packagegridtile.html" import render_pkggrid %}
506                         {{ render_pkggrid(alternatives) }}
507                 {% endif %}
508
509                 {% if similar_topics %}
510                         <h3>Similar Forum Topics</h3>
511                         <ul>
512                                 {% for t in similar_topics %}
513                                         <li>
514                                                 [{{ t.type.value }}]
515                                                 <a href="https://forum.minetest.net/viewtopic.php?t={{ t.topic_id }}">
516                                                         {{ t.title }} by {{ t.author.display_name }}
517                                                 </a>
518                                                 {% if t.wip %}[WIP]{% endif %}
519                                         </li>
520                                 {% endfor %}
521                         </ul>
522                 {% endif %}
523         </main>
524 {% endblock %}