55 |
56 |
57 |
75 |
76 |
77 |
78 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/brutaldon/templates/about.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load static %}
3 |
4 | {% block content %}
5 |
6 |
7 |
9 |
10 |
Brutaldon
11 |
a brutalist web interface for Mastodon
12 |
13 |
14 |
15 | Brutaldon is a client for Mastodon . You can use it to log in to any Mastodon instance from any browser, including text browsers such as lynx.
16 |
17 |
18 | You do not need a separate brutaldon account to use it. Brutaldon will authenticate you to your instance.
19 |
20 |
21 |
22 |
40 |
41 |
42 | This is version {{ version }} of brutaldon.
43 |
44 | {% endblock %}
45 |
--------------------------------------------------------------------------------
/brutaldon/templates/accounts/account_partial.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
8 |
9 | {{ account.user.display_name }} ({{ account.user.username }})
10 |
11 |
12 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/brutaldon/templates/accounts/list.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 |
6 |
Signed-in accounts
7 |
8 | {% if not accounts %}
9 |
No accounts.
10 | {% endif %}
11 |
12 |
13 | {% for account in accounts %}
14 | {% include "accounts/account_partial.html" %}
15 | {% endfor %}
16 |
17 |
18 | Or log in to another account to
19 | add it to the list.
20 |
21 |
22 |
23 | Or log out of all
24 | accounts.
25 |
26 |
27 |
28 |
29 | {% endblock %}
30 |
--------------------------------------------------------------------------------
/brutaldon/templates/comma.html:
--------------------------------------------------------------------------------
1 | {% if not forloop.first %}
2 | {% if forloop.last %}, and
3 | {% else %},
4 | {% endif %}
5 | {% endif %}
6 |
--------------------------------------------------------------------------------
/brutaldon/templates/error.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
--------------------------------------------------------------------------------
/brutaldon/templates/filters/create.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 |
6 |
7 |
Create Filter
8 |
9 |
75 |
76 |
77 |
78 | {% endblock %}
79 |
--------------------------------------------------------------------------------
/brutaldon/templates/filters/delete.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 |
Delete that filter?
6 |
7 |
8 |
Phrase: {{ filter.phrase }}
9 |
Context: {{ filter.context|join:", " }}
10 |
Whole word? {{ filter.whole_word }}
11 |
12 |
13 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/brutaldon/templates/filters/edit.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 |
6 |
7 |
Edit Filter
8 |
9 |
76 |
77 |
78 |
79 | {% endblock %}
80 |
--------------------------------------------------------------------------------
/brutaldon/templates/filters/list.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 |
6 |
Filters
7 |
8 |
9 |
10 |
11 | Phrase
12 | Filter contexts
13 |
14 |
15 |
16 |
17 |
18 | {% for filter in filters %}
19 |
20 | {{ filter.phrase }}
21 |
22 | {% for context in filter.context %}
23 | {{ context }}
24 | {% endfor %}
25 |
26 |
27 |
28 |
29 | Edit filter
30 |
31 |
32 |
33 |
39 |
40 | Delete filter
41 |
42 |
43 |
46 |
47 |
48 | {% endfor %}
49 |
50 |
51 |
52 |
53 |
54 | Create filter
55 |
56 |
57 |
58 | {% endblock %}
59 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/block.html:
--------------------------------------------------------------------------------
1 | {% if not relationship.blocking %}
2 |
6 | Block
7 |
8 | {% else %}
9 |
13 | Unblock
14 |
15 | {% endif %}
16 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/boost.html:
--------------------------------------------------------------------------------
1 | {% if toot.visibility != 'private' and toot.visibility != 'direct' %}
2 | {% if toot.reblogged %}
3 |
11 | {% endif %}
12 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/fav.html:
--------------------------------------------------------------------------------
1 | {% if toot.favourited %}
2 |
3 | Favorited
4 | {% else %}
5 |
6 | Favorite
7 | {% endif %}
8 |
9 |
10 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/follow.html:
--------------------------------------------------------------------------------
1 | {% if relationship.requested %}
2 |
6 | Cancel request
7 |
8 | {% elif not relationship.following %}
9 |
13 | Follow
14 |
15 | {% else %}
16 |
20 | Unfollow
21 |
22 | {% endif %}
23 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/mute.html:
--------------------------------------------------------------------------------
1 | {% if not relationship.muting %}
2 |
6 | Mute
7 |
8 | {% else %}
9 |
13 | Unmute
14 |
15 | {% endif %}
16 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/notes.html:
--------------------------------------------------------------------------------
1 |
2 | {% if not preferences.theme.is_brutalist %}
3 |
8 | Notifications
9 |
10 | {% else %}
11 |
Notifications ({{ notifications }})
12 | {% endif %}
13 |
14 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/post.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {% include "main/post_partial.html" %}
5 |
6 |
7 |
8 |
9 |
20 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/search.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
Search
6 |
7 |
8 |
9 | You can search for tags, users, or for specific toots by URL. You may
10 | also be able to full-text search for toots you have previously
11 | interacted with.
12 |
13 |
14 |
29 |
30 |
31 |
32 |
33 |
38 |
--------------------------------------------------------------------------------
/brutaldon/templates/intercooler/users.html:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/block.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load taglinks %}
3 | {% load sanitizer %}
4 |
5 | {% block title %}Brutaldon ({{ own_acct.username }}) - confirm (un)block {% endblock %}
6 |
7 | {% block content %}
8 | {% if relationship.blocking %}
9 |
Unblock this user?
10 | {% else %}
11 |
Block this user?
12 | {% endif %}
13 |
14 |
15 |
16 |
17 |
18 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | {{ user.display_name }}
27 |
28 |
29 | @{{ user.acct }}
30 |
31 |
32 |
33 | {{ user.note | relink_toot | strip_html | safe }}
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
57 |
58 | {% endblock %}
59 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/boost.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block title %} Brutaldon ({{ own_acct.username }}) - confirm boost {% endblock %}
4 |
5 | {% block content %}
6 | {% if toot.reblogged %}
7 |
Unboost that toot?
8 | {% else %}
9 |
Boost that toot?
10 | {% endif %}
11 |
12 | {% include "main/toot_partial.html" with toot=toot %}
13 |
34 | {% endblock %}
35 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/delete.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block title %} Brutaldon - confirm delete {% endblock %}
4 |
5 | {% block content %}
6 |
Delete that toot?
7 |
8 | {% include "main/toot_partial.html" with toot=toot %}
9 |
25 | {% endblock %}
26 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/emoji.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block title %}Brutaldon ({{ own_acct.username }}) - Custom emoji reference {% endblock %}
4 |
5 | {% block content %}
6 |
7 | Custom emoji reference
8 |
9 | Copy shortcodes from the list below to use your instance's custom emoji.
10 |
11 |
12 |
13 |
14 |
15 |
16 | {% for emojo in emojos %}
17 |
18 |
19 |
20 | :{{ emojo.shortcode }}:
21 |
22 |
23 | {% endfor %}
24 |
25 |
26 | {% endblock %}
27 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/fav.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block title %} Brutaldon ({{ own_acct.username }}) - confirm favorite {% endblock %}
4 |
5 | {% block content %}
6 | {% if toot.favourited %}
7 |
Unfav that toot?
8 | {% else %}
9 |
Fav that toot?
10 | {% endif %}
11 |
12 | {% include "main/toot_partial.html" with toot=toot %}
13 |
34 | {% endblock %}
35 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/follow.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load taglinks %}
3 | {% load sanitizer %}
4 |
5 | {% block title %}Brutaldon ({{ own_acct.username }}) - confirm (un)follow {% endblock %}
6 |
7 | {% block content %}
8 | {% if relationship.requested %}
9 |
Cancel follow request?
10 | {% elif relationship.following %}
11 |
Unfollow this user?
12 | {% else %}
13 |
Follow this user?
14 | {% endif %}
15 |
16 |
17 |
18 |
19 |
20 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | {{ user.display_name }}
29 |
30 |
31 | @{{ user.acct }}
32 |
33 |
34 |
35 | {{ user.note | relink_toot | strip_html | safe }}
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
59 |
60 | {% endblock %}
61 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/home_timeline.html:
--------------------------------------------------------------------------------
1 | {% extends "main/timeline.html" %}
2 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/local_timeline.html:
--------------------------------------------------------------------------------
1 | {% extends "main/timeline.html" %}
2 |
3 | {% block pagination %}
4 |
12 | {% endblock %}
13 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/mute.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load taglinks %}
3 | {% load sanitizer %}
4 |
5 | {% block title %}Brutaldon - confirm (un)mute {% endblock %}
6 |
7 | {% block content %}
8 | {% if relationship.muting %}
9 |
Unmute this user?
10 | {% else %}
11 |
Mute this user?
12 | {% endif %}
13 |
14 |
15 |
16 |
17 |
18 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | {{ user.display_name }}
27 |
28 |
29 | @{{ user.acct }}
30 |
31 |
32 |
33 | {{ user.note | relink_toot | strip_html | safe }}
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
57 |
58 | {% endblock %}
59 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/notifications.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load humanetime %}
3 | {% load taglinks %}
4 | {% load sanitizer %}
5 |
6 | {% block title %}
7 | Brutaldon ({{ own_acct.username }}) - Notifications timelime
8 | {% endblock %}
9 |
10 | {% comment %}
11 | mastodon.notifications()[0]
12 | # Returns the following dictionary:
13 | {
14 | 'id': # id of the notification
15 | 'type': # "mention", "reblog", "favourite" or "follow"
16 | 'created_at': # The time the notification was created
17 | 'account': # User dict of the user from whom the notification originates
18 | 'status': # In case of "mention", the mentioning status
19 | # In case of reblog / favourite, the reblogged / favourited status
20 | }
21 | {% endcomment %}
22 |
23 |
24 | {% block content %}
25 |
Your notifications timeline
26 | {% for group in groups %}
27 | {% if bundle_notifications and group.0.type in bundleable %}
28 | {% if group.0.type == 'favourite' %}
29 |
30 | {% for account in group.accounts %}
31 | {% include "comma.html" %}{{ account.display_name | fix_emojos:account.emojis |strip_html |safe }}
32 | ({{ account.acct }} )
33 | {% endfor %}
34 | favorited your toot.
35 |
36 | {% include "main/toot_partial.html" with toot=group.0.status %}
37 |
38 | {% elif group.0.type == 'reblog' %}
39 |
40 | {% for account in group.accounts %}
41 | {% include "comma.html" %}{{ account.display_name | fix_emojos:account.emojis |strip_html |safe }}
42 | ({{ account.acct }} )
43 | {% endfor %}
44 | boosted your toot.
45 |
46 | {% include "main/toot_partial.html" with toot=group.0.status reblog=True reblog_by=group.0.account.acct reblog_icon=group.0.account.avatar_static %}
47 |
48 | {% endif %}
49 | {% else %}
50 | {% for note in group %}
51 | {% if note.type == 'mention' %}
52 |
53 | {{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}
54 | ({{ note.account.acct }} )
55 | mentioned you.
56 |
57 |
58 | {% include "main/toot_partial.html" with toot=note.status reblog=False %}
59 |
60 | {% elif note.type == 'reblog' %}
61 |
62 | {{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}
63 | ({{ note.account.acct }} )
64 | boosted your toot.
65 | (
66 | {{ note.created_at |humane_time }}
67 | )
68 |
69 | {% include "main/toot_partial.html" with toot=note.status reblog=True reblog_by=note.account.acct reblog_icon=note.account.avatar_static %}
70 |
71 | {% elif note.type == 'favourite' %}
72 |
73 | {{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}
74 | ({{ note.account.acct }} )
75 | favorited your toot.
76 | (
77 | {{ note.created_at |humane_time }}
78 | )
79 |
80 | {% include "main/toot_partial.html" with toot=note.status %}
81 |
82 | {% elif note.type == 'follow' %}
83 |
84 |
85 |
86 |
87 |
88 |
89 |
99 |
100 |
101 | {% elif note.type == 'poll' %}
102 |
A poll you created or voted in has ended.
103 | {% include "main/toot_partial.html" with toot=note.status %}
104 |
105 | {% endif %}
106 | {% endfor %}
107 | {% endif %}
108 | {% endfor %}
109 |
110 |
118 |
119 |
120 | {% endblock %}
121 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/post.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load static %}
3 |
4 | {% block title %} Brutaldon ({{ own_acct.username }}) - toot {% endblock %}
5 |
6 | {% block content %}
7 |
Toot!
8 |
9 | {% include "main/post_partial.html" %}
10 |
11 | {% endblock %}
12 |
13 | {% block page_scripts_inline %}
14 |
23 | {% endblock %}
24 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/post_minimal_partial.html:
--------------------------------------------------------------------------------
1 | {% load widget_tweaks %}
2 |
56 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/post_partial.html:
--------------------------------------------------------------------------------
1 | {% load widget_tweaks %}
2 |
3 | {% if reply %}
4 |
5 | {% elif redraft %}
6 |
7 | {% else %}
8 |
9 | {% endif %}
10 | {% csrf_token %}
11 |
12 |
13 | {{ form.non_field_errors }}
14 |
15 |
16 |
17 |
18 |
{{ form.spoiler_text.label }}
19 |
20 | {% render_field form.spoiler_text class+="input mousetrap" placeholder="Optional" %}
21 |
22 |
23 |
24 |
25 |
{{ form.status.label }}
26 |
27 |
{% if form.status.value %}{{ form.status.value }}{% endif %}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
{{ form.visibility.label }}
39 |
40 |
41 | {% render_field form.visibility class+="select"%}
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | {% render_field form.media_file_1 class+="file-input" %}
53 |
54 |
55 |
56 |
57 |
58 | {{ form.media_file_1.label }}
59 |
60 |
61 |
62 |
63 |
64 | {% render_field form.media_text_1 class+="input mousetrap" placeholder="Describe attachment" %}
65 |
66 |
67 |
68 |
69 |
70 |
71 | {% render_field form.media_file_2 class+="file-input" %}
72 |
73 |
74 |
75 |
76 |
77 | {{ form.media_file_2.label }}
78 |
79 |
80 |
81 |
82 |
83 | {% render_field form.media_text_2 class+="input mousetrap" placeholder="Describe attachment" %}
84 |
85 |
86 |
87 |
88 |
89 |
90 | {% render_field form.media_file_3 class+="file-input" %}
91 |
92 |
93 |
94 |
95 |
96 | {{ form.media_file_3.label }}
97 |
98 |
99 |
100 |
101 |
102 | {% render_field form.media_text_3 class+="input mousetrap" placeholder="Describe attachment" %}
103 |
104 |
105 |
106 |
107 |
108 | {% render_field form.media_file_4 class+="file-input" %}
109 |
110 |
111 |
112 |
113 |
114 | {{ form.media_file_4.label }}
115 |
116 |
117 |
118 |
119 |
120 | {% render_field form.media_text_4 class+="input mousetrap" placeholder="Describe attachment" %}
121 |
122 |
123 |
124 |
125 |
136 | {% if not preferences.no_javascript %}
137 |
142 | {% endif %}
143 |
144 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/public_timeline.html:
--------------------------------------------------------------------------------
1 | {% extends "main/timeline.html" %}
2 |
3 | {% block pagination %}
4 |
12 | {% endblock %}
13 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/redraft.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load humanize %}
3 | {% load static %}
4 |
5 | {% block title %}
6 | Brutaldon ({{ own_acct.username }}) - reply
7 | {% endblock %}
8 |
9 | {% block page_scripts %}
10 |
11 | {% endblock %}
12 |
13 | {% block content %}
14 |
Redraft
15 | {% include "main/toot_partial.html" with toot=toot active=True %}
16 |
17 |
18 |
19 | Submitting this form will post this replacement toot, and
20 | delete the original toot. The replacement toot will not
21 | have any favs, boosts, or replies that the original toot had.
22 | Currently, media attachments must be re-uploaded. Sorry, working on it.
23 |
24 |
25 |
26 |
27 | {% include "main/post_partial.html" %}
28 |
29 |
30 | {% endblock %}
31 |
32 | {% block page_scripts_inline %}
33 |
42 | {% endblock %}
43 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/reply.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load humanize %}
3 | {% load static %}
4 |
5 | {% block title %}
6 | Brutaldon ({{ own_acct.username }}) - reply
7 | {% endblock %}
8 |
9 | {% block page_scripts %}
10 |
11 | {% endblock %}
12 |
13 | {% block content %}
14 |
Thread
15 | {% for ancestor in context.ancestors %}
16 | {% include "main/toot_partial.html" with toot=ancestor %}
17 |
18 | {% endfor %}
19 | {% include "main/toot_partial.html" with toot=toot active=True %}
20 |
21 |
22 | {% include "main/post_partial.html" %}
23 |
24 |
25 | {% endblock %}
26 |
27 | {% block page_scripts_inline %}
28 |
37 | {% endblock %}
38 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/search.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block title %}brutaldon ({{ own_acct.username }}) – search {% endblock %}
5 |
6 | {% block content %}
7 |
Search
8 |
9 |
10 |
11 | You can search for tags, users, or for specific toots by URL. You may
12 | also be able to full-text search for toots you have previously
13 | interacted with.
14 |
15 |
16 |
17 |
18 |
19 |
{{ form.instance.label }}
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | {% endblock %}
34 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/search_results.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load humanize %}
3 | {% load taglinks %}
4 | {% load sanitizer %}
5 |
6 | {% block title %}
7 | Brutaldon ({{ own_acct.username }}) - search results
8 | {% endblock %}
9 |
10 | {% comment %}
11 | mastodon.search("
")
12 | # Returns the following dictionary
13 | {
14 | 'accounts': # List of account dicts resulting from the query
15 | 'hashtags': # List of hashtag dicts resulting from the query
16 | 'statuses': # List of toot dicts resulting from the query
17 | }
18 |
19 | {% endcomment %}
20 |
21 | {% block content %}
22 |
23 |
24 |
25 |
35 |
36 |
37 |
38 |
39 |
40 | Search results
41 |
42 |
Users
43 | {% for user in results.accounts %}
44 |
45 |
46 |
47 |
48 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | {{ user.display_name }}
57 |
58 |
59 | @{{ user.acct }}
60 |
61 |
62 |
63 | {{ user.note | relink_toot | strip_html | safe }}
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | {% endfor %}
73 |
74 |
75 |
Tags
76 |
77 | {% for tag in results.hashtags %}
78 | #{{ tag.name }}
79 | {% endfor %}
80 |
81 |
82 |
Toots
83 | {% for toot in results.statuses %}
84 | {% include "main/toot_partial.html" with toot=toot reblog=False %}
85 | {% endfor %}
86 |
87 | {% endblock %}
88 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/thread.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load humanize %}
3 |
4 | {% block title %}
5 | Brutaldon ({{ own_acct.username }}) - thread
6 | {% endblock %}
7 |
8 | {% comment %}
9 | mastodon.status_context()
10 | # Returns the following dictionary:
11 | {
12 | 'ancestors': # A list of toot dicts
13 | 'descendants': # A list of toot dicts
14 | }
15 | {% endcomment %}
16 |
17 | {% block content %}
18 |
19 | Thread
20 |
21 | {% include "main/toot_partial.html" with toot=root %}
22 | {% for descendant in descendants %}
23 | {% if descendant == toot %}
24 | {% include "main/toot_partial.html" with toot=toot active=True %}
25 | {% else %}
26 | {% include "main/toot_partial.html" with toot=descendant %}
27 | {% endif %}
28 |
29 | {% endfor %}
30 |
31 | {% if not preferences.no_javascript %}
32 |
35 | {% endif %}
36 | {% endblock %}
37 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/timeline.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load humanize %}
3 | {% load static %}
4 | {% load cache %}
5 |
6 | {% block title %}
7 | Brutaldon ({{ own_acct.username }}) - {{ timeline_name }} timelime
8 | {% endblock %}
9 |
10 | {% block page_scripts %}
11 | {% if not fullbrutalism %}
12 |
13 | {% endif %}
14 | {% endblock %}
15 |
16 | {% block content %}
17 | {% if form %}
18 | Post
19 |
20 | {% include "main/post_minimal_partial.html" %}
21 |
22 |
23 | {% endif %}
24 | Your {{ timeline_name }} timeline
25 |
26 | {% for toot in toots %}
27 | {% cache 600 toot_partial toot.id %}
28 | {% if toot.reblog %}
29 | {% include "main/toot_partial.html" with toot=toot.reblog reblog=True reblog_by=toot.account.acct reblog_icon=toot.account.avatar_static %}
30 | {% else %}
31 | {% include "main/toot_partial.html" with toot=toot reblog=False %}
32 | {% endif %}
33 | {% endcache %}
34 |
35 | {% endfor %}
36 |
37 | {% block pagination %}
38 |
67 | {% endblock %}
68 |
69 | {% endblock %}
70 |
71 | {% block page_scripts_inline %}
72 |
81 | {% endblock %}
82 |
--------------------------------------------------------------------------------
/brutaldon/templates/main/user.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load humanize %}
3 | {% load sanitizer %}
4 | {% load taglinks %}
5 |
6 | {% block title %}
7 | Brutaldon ({{ own_acct.username }}) - {{ user.acct }} timelime
8 | {% endblock %}
9 |
10 | {% block content %}
11 |
12 |
13 | {% if not preferences.theme.is_brutalist %}
14 |
110 |
111 |
112 |
113 | {% for toot in toots %}
114 | {% if toot.reblog %}
115 | {% include "main/toot_partial.html" with toot=toot.reblog reblog=True reblog_by=toot.account.acct reblog_icon=toot.account.avatar_static %}
116 | {% else %}
117 | {% include "main/toot_partial.html" with toot=toot reblog=False %}
118 | {% endif %}
119 |
120 | {% endfor %}
121 |
129 |
130 | {% endblock %}
131 |
--------------------------------------------------------------------------------
/brutaldon/templates/polls/completed_partial.html:
--------------------------------------------------------------------------------
1 | {% load sanitizer %}
2 | {% load taglinks %}
3 | {% load static %}
4 |
5 | {% for option in toot.poll.options %}
6 |
7 | {{ option.title }}
8 | ({{ option.votes_count}} vote{{ option.votes_count|pluralize }})
9 |
10 |
11 |
18 | {% endfor %}
19 |
20 |
--------------------------------------------------------------------------------
/brutaldon/templates/polls/new_partial.html:
--------------------------------------------------------------------------------
1 | {% load sanitizer %}
2 | {% load taglinks %}
3 | {% load static %}
4 |
5 |
10 | {% csrf_token %}
11 | {% for option in toot.poll.options %}
12 |
13 | {% if toot.poll.multiple %}
14 |
15 |
18 | {{ option.title }}
19 |
20 | {% else %}
21 |
22 |
25 | {{ option.title }}
26 |
27 | {% endif %}
28 |
29 | {% endfor %}
30 |
31 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/brutaldon/templates/privacy.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load static %}
3 |
4 | {% block content %}
5 |
Privacy statement
6 |
A shameful attempt at ass-covering
7 |
8 |
9 | Summary
10 |
11 | Brutaldon tries to collect as little information about you as possible. The information that it collects in order to log you in to your instance and to implement client features is stored as transiently as possible.
12 |
13 |
14 |
15 |
16 | Information that is stored until a database wipe
17 |
18 |
19 | If you use the old login form (instance, email, password), which is only recommended if you running your own copy of brutaldon behind a firewall, the email you use to sign in will be stored along with an access token and the name of the instance you connected to. Your password will never be stored. We will never share your email with anyone for any reason, unless legally forced to do so. We will never send you email except in the case of an unforseen emergency requiring us to.
20 |
21 |
22 | If you use the normal login form, your email will not be stored, only your instance name and access token.
23 |
24 |
25 | Both methods of login will store your username and instance name. All of your brutaldon settings (theme, timezone, etc) are stored and associated with your username.
26 |
27 |
28 |
29 | You can always revoke an access token through the web interface of your instance.
30 |
31 |
32 | Information that is stored only during your session
33 |
34 |
35 | Data stored in your session is deleted when you log out, or periodically by the server.
36 |
37 |
38 |
39 | Data stored in the session includes:
40 |
41 |
42 | A reference to your information in the database.
43 | All of your public Mastodon profile information. This is needed for some client functionality.
44 |
45 |
46 | {% endblock %}
47 |
--------------------------------------------------------------------------------
/brutaldon/templates/requests/list.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 |
6 |
Follow requests
7 |
8 | {% if not requests %}
9 |
No follow requests.
10 | {% endif %}
11 |
12 |
13 | {% for request in requests %}
14 | {% include "requests/request_partial.html" %}
15 | {% endfor %}
16 |
17 |
18 |
19 | {% endblock %}
20 |
--------------------------------------------------------------------------------
/brutaldon/templates/requests/request_partial.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
8 |
9 | {{ request.display_name }} ({{ request.acct }})
10 |
11 |
12 |
13 | {% csrf_token %}
14 |
15 | Accept
16 |
17 |
18 | Reject
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/brutaldon/templates/setup/login-oauth.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 | Log in to your instance
6 |
7 |
8 | {% csrf_token %}
9 |
10 |
{{ form.instance.label }}
11 |
12 | {% render_field form.instance class+="input" %}
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | Not able to log in with this form? Maybe your brutaldon instance isn't
29 | visible on the internet to your Mastodon instance? If so, you can use
30 | the
old login form .
31 |
32 |
33 |
34 | {% endblock %}
35 |
--------------------------------------------------------------------------------
/brutaldon/templates/setup/login.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 | Log in to your instance
6 |
7 |
8 | {% csrf_token %}
9 |
10 |
{{ form.instance.label }}
11 |
12 | {% render_field form.instance class+="input" %}
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
{{ form.email.label }}
21 |
22 | {% render_field form.email class+="input" %}
23 |
24 |
25 |
26 |
27 |
28 |
29 |
{{ form.password.label }}
30 |
31 | {% render_field form.password class+="input" type="password" %}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
40 |
41 |
42 | {% if form.errors %}
43 |
44 | {{ form.non_field_errors | escape }}
45 |
46 | {% endif %}
47 |
48 |
49 |
50 |
51 | This information is only used to log you in to your instance for the
52 | first time. Brutaldon never stores your username and password; it
53 | only uses it to acquire a token which you can disable from the
54 | settings page of your Mastodon instance. However, you do need to
55 | absolutely trust the person running this copy of brutaldon! If that's
56 | not the case, use the OAuth login form .
57 |
58 |
59 |
60 | {% endblock %}
61 |
--------------------------------------------------------------------------------
/brutaldon/templates/setup/settings.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load widget_tweaks %}
3 |
4 | {% block content %}
5 |
6 |
Settings
7 |
8 | {% csrf_token %}
9 |
10 | General Options
11 |
12 |
{{ form.theme.label }}
13 |
14 |
15 | {% render_field form.theme class+="select" %}
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
{{ form.timezone.label }}
24 |
25 |
26 | {% render_field form.timezone class+="select" %}
27 |
28 |
29 |
30 |
31 |
32 |
33 | Content Options
34 |
35 |
36 |
37 | {% render_field form.preview_sensitive class+="checkbox" %}
38 | {{ form.preview_sensitive.label }}
39 |
40 |
41 |
42 |
43 | {{ form.preview_sensitive.help_text }}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Timeline Options
52 |
53 |
54 | {% render_field form.filter_replies %}
55 | {{ form.filter_replies.label }}
56 |
57 |
58 |
59 |
60 | {% render_field form.filter_boosts %}
61 | {{ form.filter_boosts.label }}
62 |
63 |
64 |
65 |
66 |
67 | {% render_field form.filter_notifications class+="checkbox" %}
68 | {{ form.filter_notifications.label }}
69 |
70 |
71 |
72 |
73 | {{ form.filter_notifications.help_text }}
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 | {% render_field form.bundle_notifications class+="checkbox" %}
84 | {{ form.bundle_notifications.label }}
85 |
86 |
87 |
88 |
89 | {{ form.bundle_notifications.help_text }}
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 | JavaScript Options
98 |
99 |
100 |
101 | {% render_field form.no_javascript class+="checkbox" %}
102 | {{ form.no_javascript.label }}
103 |
104 |
105 |
106 |
107 | {{ form.no_javascript.help_text }}
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 | {% render_field form.notifications class+="checkbox" %}
118 | {{ form.notifications.label }}
119 |
120 |
121 |
122 |
123 | {{ form.notifications.help_text }}
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | {% render_field form.click_to_load class+="checkbox" %}
134 | {{ form.click_to_load.label }}
135 |
136 |
137 |
138 |
139 | {{ form.click_to_load.help_text }}
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 | {% render_field form.lightbox class+="checkbox" %}
150 | {{ form.lightbox.label }}
151 |
152 |
153 |
154 |
155 | {{ form.lightbox.help_text }}
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 | {{ form.poll_frequency.label }}
167 |
168 |
169 | {% render_field form.poll_frequency class+="input" %}
170 |
171 |
172 |
173 |
174 | {{ form.poll_frequency.help_text }}
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
185 |
186 |
187 |
188 |
Bookmarklet
189 |
190 | Share via brutaldon
191 |
192 |
193 |
Filters and More
194 |
List filters
195 |
Follow requests
196 |
197 |
198 | {% endblock %}
199 |
--------------------------------------------------------------------------------
/brutaldon/templatetags/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jfmcbrayer/brutaldon/e6c5273a2f9135d57fc8568d423a58e59bc5ec08/brutaldon/templatetags/__init__.py
--------------------------------------------------------------------------------
/brutaldon/templatetags/humanetime.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime, timedelta
2 | from django.utils.timezone import get_default_timezone, get_current_timezone, localtime
3 | from django.utils.timezone import now as django_now
4 | from django.utils.translation import gettext as _
5 | from django import template
6 |
7 | register = template.Library()
8 |
9 |
10 | @register.filter(is_safe=True)
11 | def humane_time(arg):
12 | """Returns a time string that is humane but not relative (unlike Django's humanetime)
13 |
14 | For times less than 6 hours ago: display date and time to the minute.
15 | For times less than 12 hours ago: display date and time to the hour.
16 | For times more than 12 hours ago display date and "time of day".
17 | For times more than 2 days ago display date.
18 | For times more than 6 months ago, display month and year.
19 | For times more than 10 years ago, display year.
20 |
21 | Prefer words to numbers, unless it is too long.
22 |
23 | The goal is a date/time that is always accurate no matter how long it's
24 | been sitting there waiting for you to look at it, but is only precise
25 | to a degree you are liable to care about.
26 |
27 | It is not safe to use on future times.
28 |
29 | FIXME: work out how best to make these strings translatable
30 |
31 | """
32 | now = django_now()
33 | arg = localtime(arg)
34 | diff = now - arg
35 |
36 | if arg.tzinfo == now.tzinfo:
37 | utc = " (UTC)"
38 | else:
39 | utc = ""
40 | if diff < timedelta(hours=6):
41 | return arg.strftime("%a, %b %d, %Y at %I:%M %p") + utc
42 | elif diff < timedelta(hours=12):
43 | return arg.strftime("%a, %b %d, %Y around %I %p") + utc
44 | elif diff < timedelta(hours=36):
45 | return arg.strftime("%a, %b %d, %Y in the ") + time_of_day(arg.hour) + utc
46 | elif diff < timedelta(days=6 * 28):
47 | return arg.strftime("%b %d, %Y")
48 | elif diff < timedelta(days=10 * 365):
49 | return arg.strftime("%b, %Y")
50 | else:
51 | return arg.strftime("%Y")
52 |
53 |
54 | def time_of_day(hour):
55 | """Return a description of what time of day an hour is.
56 |
57 | This is very english-centric and probably not translatable.
58 | """
59 | if hour < 3:
60 | return _("wee hours")
61 | elif hour < 6:
62 | return _("early morning")
63 | elif hour < 12:
64 | return _("morning")
65 | elif hour < 18:
66 | return _("afternoon")
67 | elif hour < 22:
68 | return _("evening")
69 | else:
70 | return _("night")
71 |
--------------------------------------------------------------------------------
/brutaldon/templatetags/taglinks.py:
--------------------------------------------------------------------------------
1 | from django import template
2 | from bs4 import BeautifulSoup
3 | from urllib import parse
4 | from django.urls import reverse
5 | from django.utils.translation import gettext as _
6 | from pdb import set_trace
7 |
8 | register = template.Library()
9 |
10 |
11 | @register.filter
12 | def pdb(element):
13 | set_trace()
14 | return element
15 |
16 |
17 | @register.filter
18 | def relink_tags(value):
19 | """Treat the text as html, and replace tag links with app-internal tag links
20 |
21 | Currently, this only works for tags in toots coming from Mastodon servers,
22 | not necessarily GNU Social, Pleroma, or other fediverse servers, because
23 | it relies on the markup that Mastodon puts on tags.
24 |
25 | FIXME: handle arbitrary tag links
26 | """
27 | value = value.replace("'", "'")
28 | soup = BeautifulSoup(value, "html.parser")
29 | for link in soup.find_all("a", class_="hashtag"):
30 | try:
31 | link["href"] = reverse("tag", args=[link.span.string])
32 | except:
33 | continue
34 | return soup.decode(formatter="html")
35 |
36 |
37 | @register.filter
38 | def relink_mentions(value):
39 | """Treat the text as html, and replace mention links with app-internal links
40 |
41 | Currently, this only works for mentions in toots coming from Mastodon servers,
42 | not necessarily GNU Social, Pleroma, or other fediverse servers, because
43 | it relies on the markup that Mastodon puts on mentions.
44 |
45 | FIXME: handle arbitrary mention links
46 | """
47 | value = value.replace("'", "'")
48 | soup = BeautifulSoup(value, "html.parser")
49 | for link in soup.find_all("a", class_="mention"):
50 | parsed = parse.urlparse(link["href"])
51 | try:
52 | instance = parsed[1]
53 | user = parsed[2][2:]
54 | link["href"] = reverse("user", args=[user + "@" + instance])
55 | except:
56 | continue
57 | return soup.decode(formatter="html")
58 |
59 |
60 | @register.filter
61 | def relink_toot(value):
62 | return relink_tags(relink_mentions(value))
63 |
64 |
65 | @register.filter
66 | def localuser(value):
67 | """Convert a remote user link to local"""
68 | try:
69 | parsed = parse.urlparse(value)
70 | instance = parsed[1]
71 | if parsed[2].startswith("/@"):
72 | user = parsed[2][2:]
73 | else:
74 | user = parsed[2].split("/")[-1]
75 | local = reverse("user", args=[user + "@" + instance])
76 | except:
77 | local = value
78 | return local
79 |
80 |
81 | @register.filter
82 | def fix_emojos(value, emojos):
83 | """Replace instances of recognized custom emoji :shortcodes: in value with image link tags
84 | """
85 | for emojo in emojos:
86 | try:
87 | value = value.replace(
88 | ":%(shortcode)s:" % emojo,
89 | ' '
90 | % emojo,
91 | )
92 | except:
93 | continue
94 | return value
95 |
--------------------------------------------------------------------------------
/brutaldon/urls.py:
--------------------------------------------------------------------------------
1 | """brutaldon URL Configuration
2 |
3 | The `urlpatterns` list routes URLs to views. For more information please see:
4 | https://docs.djangoproject.com/en/2.0/topics/http/urls/
5 | Examples:
6 | Function views
7 | 1. Add an import: from my_app import views
8 | 2. Add a URL to urlpatterns: path('', views.home, name='home')
9 | Class-based views
10 | 1. Add an import: from other_app.views import Home
11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
12 | Including another URLconf
13 | 1. Import the include() function: from django.urls import include, path
14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
15 | """
16 | from django.contrib import admin
17 | from django.urls import path
18 | from brutaldon import views
19 |
20 | urlpatterns = [
21 | path("admin/", admin.site.urls),
22 | path("about", views.about, name="about"),
23 | path("privacy", views.privacy, name="privacy"),
24 | path("home/next/", views.home, name="home_next"),
25 | path("home/prev/", views.home, name="home_prev"),
26 | path("home", views.home, name="home"),
27 | path("login", views.login, name="login"),
28 | path("oldlogin", views.old_login, name="oldlogin"),
29 | path("logout", views.logout, name="logout"),
30 | path("oauth_callback", views.oauth_callback, name="oauth_callback"),
31 | path("error", views.error, name="error"),
32 | path("local", views.local, name="local"),
33 | path("local/next/", views.local, name="local_next"),
34 | path("local/prev/", views.local, name="local_prev"),
35 | path("fed", views.fed, name="fed"),
36 | path("fed/next/", views.fed, name="fed_next"),
37 | path("fed/prev/", views.fed, name="fed_prev"),
38 | path("note", views.note, name="note"),
39 | path("note/next", views.note, name="note_next"),
40 | path("note/prev/", views.note, name="note_prev"),
41 | path("notes_count", views.notes_count, name="notes_count"),
42 | path("user_search", views.user_search, name="user_search"),
43 | path("settings", views.settings, name="settings"),
44 | path("thread/", views.thread, name="thread"),
45 | path("tags/", views.tag, name="tag"),
46 | path("user/", views.home, name="user_bad"),
47 | path("user/", views.user, name="user"),
48 | # next/prev are integers, but pleroma uses 128 bit integers
49 | # ...encoded in Base62.
50 | # aka a "flake_id"
51 | # from baseconv import base62, but we don't need to decode it
52 | # just pass it along back to pleroma but it is NOT an
53 | path("user//next/", views.user, name="user_next"),
54 | path("user//prev/", views.user, name="user_prev"),
55 | path("toot/", views.toot, name="toot"),
56 | path("toot", views.toot, name="toot"),
57 | path("reply/", views.reply, name="reply"),
58 | path("redraft/", views.redraft, name="redraft"),
59 | path("fav/", views.fav, name="fav"),
60 | path("boost/", views.boost, name="boost"),
61 | path("delete/", views.delete, name="delete"),
62 | path("follow/", views.follow, name="follow"),
63 | path("block/", views.block, name="block"),
64 | path("mute/", views.mute, name="mute"),
65 | path("search", views.search, name="search"),
66 | path("search_results", views.search_results, name="search_results"),
67 | path("emoji", views.emoji_reference, name="emoji"),
68 | path("filters/list", views.list_filters, name="list_filters"),
69 | path("filters/create", views.create_filter, name="create_filter"),
70 | path("filters/delete/", views.delete_filter, name="delete_filter"),
71 | path("filters/edit/", views.edit_filter, name="edit_filter"),
72 | path("requests/", views.follow_requests, name="follow_requests"),
73 | path("requests/", views.follow_requests, name="follow_requests"),
74 | path("accounts/", views.accounts, name="accounts"),
75 | path("accounts/", views.accounts, name="accounts"),
76 | path("vote/", views.vote, name="vote"),
77 | path("share/", views.share, name="share"),
78 | path("", views.home, name=""),
79 | ]
80 |
--------------------------------------------------------------------------------
/brutaldon/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for brutaldon project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "brutaldon.settings")
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/docs/screenshots/screenshot-firefox-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jfmcbrayer/brutaldon/e6c5273a2f9135d57fc8568d423a58e59bc5ec08/docs/screenshots/screenshot-firefox-2.png
--------------------------------------------------------------------------------
/docs/screenshots/screenshot-firefox-brutalist-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jfmcbrayer/brutaldon/e6c5273a2f9135d57fc8568d423a58e59bc5ec08/docs/screenshots/screenshot-firefox-brutalist-2.png
--------------------------------------------------------------------------------
/docs/screenshots/screenshot-firefox-brutalist.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jfmcbrayer/brutaldon/e6c5273a2f9135d57fc8568d423a58e59bc5ec08/docs/screenshots/screenshot-firefox-brutalist.png
--------------------------------------------------------------------------------
/docs/screenshots/screenshot-firefox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jfmcbrayer/brutaldon/e6c5273a2f9135d57fc8568d423a58e59bc5ec08/docs/screenshots/screenshot-firefox.png
--------------------------------------------------------------------------------
/docs/screenshots/screenshot-lynx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jfmcbrayer/brutaldon/e6c5273a2f9135d57fc8568d423a58e59bc5ec08/docs/screenshots/screenshot-lynx.png
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | import os
3 | import sys
4 |
5 | if __name__ == "__main__":
6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "brutaldon.settings")
7 | try:
8 | from django.core.management import execute_from_command_line
9 | except ImportError as exc:
10 | raise ImportError(
11 | "Couldn't import Django. Are you sure it's installed and "
12 | "available on your PYTHONPATH environment variable? Did you "
13 | "forget to activate a virtual environment?"
14 | ) from exc
15 | execute_from_command_line(sys.argv)
16 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "bulma": "^0.7.5",
4 | "bulma-extensions": "^2.2.2",
5 | "bulmaswatch": "^0.6.2",
6 | "fork-awesome": "^1.1.0",
7 | "intercooler": "^1.2.1",
8 | "jquery": "^3.4.1",
9 | "loading-attribute-polyfill": "^1.2.0",
10 | "magnific-popup": "^1.1.0",
11 | "mousetrap": "^1.6.2"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------