##// END OF EJS Templates
Added landing page which will be the default on /
neko259 -
r1732:24d0b585 default
parent child Browse files
Show More
@@ -0,0 +1,31 b''
1 {% extends "boards/base.html" %}
2
3 {% load i18n %}
4 {% load static %}
5
6 {% block head %}
7 <title>{{ site_name }}</title>
8 {% endblock %}
9
10 {% block content %}
11 <div class="post">
12 <div class="landing-images">
13 {% for image in images %}
14 <div class="gallery_image">
15 {{ image.get_view|safe }}
16 {% with image.get_random_associated_post as post %}
17 {{ post.get_link_view|safe }}
18 {% endwith %}
19 </div>
20 {% endfor %}
21 </div>
22 <div class="landing-tags">
23 {{ section_str|safe }}
24 </div>
25 <div class="landing-threads">
26 {% for op in latest_threads %}
27 {{ op.get_link_view|safe }} {{ op.get_title_or_text }}<br />
28 {% endfor %}
29 </div>
30 </div>
31 {% endblock %}
@@ -0,0 +1,32 b''
1 from django.shortcuts import render
2 from django.utils.decorators import method_decorator
3 from django.views.decorators.csrf import csrf_protect
4
5 from boards.views.base import BaseBoardView
6 from boards.models import Tag, Post, Attachment
7
8
9 PARAM_SECTION_STR = 'section_str'
10 PARAM_LATEST_THREADS = 'latest_threads'
11 PARAM_IMAGES = 'images'
12
13 TEMPLATE = 'boards/landing.html'
14
15 MAX_NEW_THREADS = 10
16 RANDOM_IMAGE_COUNT = 3
17
18
19 class LandingView(BaseBoardView):
20 @method_decorator(csrf_protect)
21 def get(self, request):
22 params = dict()
23
24 params[PARAM_SECTION_STR] = Tag.objects.get_tag_url_list(
25 Tag.objects.filter(required=True))
26 params[PARAM_LATEST_THREADS] = Post.objects.filter(opening=True)\
27 .order_by('-pub_time')[:MAX_NEW_THREADS]
28 params[PARAM_IMAGES] = Attachment.objects.get_random_images(
29 RANDOM_IMAGE_COUNT)
30
31 return render(request, TEMPLATE, params)
32
@@ -1,175 +1,186 b''
1 1 .ui-button {
2 2 display: none;
3 3 }
4 4
5 5 .ui-dialog-content {
6 6 padding: 0;
7 7 min-height: 0;
8 8 }
9 9
10 10 .mark_btn {
11 11 cursor: pointer;
12 12 }
13 13
14 14 .img-full {
15 15 position: fixed;
16 16 background-color: #CCC;
17 17 border: 1px solid #000;
18 18 cursor: pointer;
19 19 }
20 20
21 21 .strikethrough {
22 22 text-decoration: line-through;
23 23 }
24 24
25 25 .post_preview {
26 26 z-index: 300;
27 27 position:absolute;
28 28 }
29 29
30 30 .gallery_image {
31 31 display: inline-block;
32 32 }
33 33
34 34 @media print {
35 35 .post-form-w {
36 36 display: none;
37 37 }
38 38 }
39 39
40 40 input[name="image"] {
41 41 display: block;
42 42 width: 100px;
43 43 height: 100px;
44 44 cursor: pointer;
45 45 position: absolute;
46 46 opacity: 0;
47 47 z-index: 1;
48 48 }
49 49
50 50 .file_wrap {
51 51 width: 100px;
52 52 height: 100px;
53 53 border: solid 1px white;
54 54 display: inline-block;
55 55 }
56 56
57 57 form > .file_wrap {
58 58 float: left;
59 59 }
60 60
61 61 .file-thumb {
62 62 width: 100px;
63 63 height: 100px;
64 64 background-size: cover;
65 65 background-position: center;
66 66 }
67 67
68 68 .compact-form-text {
69 69 margin-left:110px;
70 70 }
71 71
72 72 textarea, input {
73 73 -moz-box-sizing: border-box;
74 74 -webkit-box-sizing: border-box;
75 75 box-sizing: border-box;
76 76 }
77 77
78 78 .compact-form-text > textarea {
79 79 height: 100px;
80 80 width: 100%;
81 81 }
82 82
83 83 .post-button-form {
84 84 display: inline;
85 85 }
86 86
87 87 .post-button-form > button, #autoupdate {
88 88 border: none;
89 89 margin: inherit;
90 90 padding: inherit;
91 91 background: none;
92 92 font-size: inherit;
93 93 cursor: pointer;
94 94 }
95 95
96 96 #form-close-button {
97 97 display: none;
98 98 }
99 99
100 100 .post-image-full {
101 101 width: 100%;
102 102 height: auto;
103 103 }
104 104
105 105 #preview-text {
106 106 display: none;
107 107 }
108 108
109 109 .random-images-table {
110 110 text-align: center;
111 111 width: 100%;
112 112 }
113 113
114 114 .random-images-table > div {
115 115 margin-left: auto;
116 116 margin-right: auto;
117 117 }
118 118
119 119 .tag-image, .tag-text-data {
120 120 display: inline-block;
121 121 }
122 122
123 123 .tag-text-data > h2 {
124 124 margin: 0;
125 125 }
126 126
127 127 .tag-image {
128 128 margin-right: 5px;
129 129 }
130 130
131 131 .reply-to-message {
132 132 display: none;
133 133 }
134 134
135 135 .tripcode {
136 136 padding: 2px;
137 137 }
138 138
139 139 #fav-panel {
140 140 display: none;
141 141 margin: 1ex;
142 142 }
143 143
144 144 .hidden_post {
145 145 opacity: 0.2;
146 146 }
147 147
148 148 .hidden_post:hover {
149 149 opacity: 1;
150 150 }
151 151
152 152 .monochrome > .image > .thumb > img {
153 153 filter: grayscale(100%);
154 154 -webkit-filter: grayscale(100%);
155 155 }
156 156
157 157 #quote-button {
158 158 position: absolute;
159 159 display: none;
160 160 cursor: pointer;
161 161 z-index: 400;
162 162 }
163 163
164 164 .required-field:before {
165 165 content: '* ';
166 166 }
167 167
168 168 .hint {
169 169 border-bottom: dashed 1px;
170 170 cursor: help;
171 171 }
172 172
173 173 .url-image:hover {
174 174 filter: invert(100%);
175 175 }
176
177 .landing-tags, .landing-threads, .landing-images {
178 max-width: 800px;
179 margin-left: auto;
180 margin-right: auto;
181 }
182
183 .landing-images {
184 text-align: center;
185 }
186
@@ -1,94 +1,93 b''
1 1 {% load staticfiles %}
2 2 {% load i18n %}
3 3 {% load l10n %}
4 4 {% load static from staticfiles %}
5 5
6 6 <!DOCTYPE html>
7 7 <html>
8 8 <head>
9 9 <link rel="stylesheet" type="text/css" href="{% static 'css/base.css' %}" media="all"/>
10 10 <link rel="stylesheet" type="text/css" href="{% static 'css/3party/highlight.css' %}" media="all"/>
11 11 <link rel="stylesheet" type="text/css" href="{% static 'css/3party/jquery-ui.min.css' %}" media="all"/>
12 12 <link rel="stylesheet" type="text/css" href="{% static theme_css %}" media="all"/>
13 13
14 14 {% if rss_url %}
15 15 <link rel="alternate" type="application/rss+xml" href="{{ rss_url }}" title="{% trans 'Feed' %}"/>
16 16 {% endif %}
17 17
18 18 <link rel="icon" type="image/png"
19 19 href="{% static 'favicon.png' %}">
20 20
21 21 <meta name="viewport" content="width=device-width, initial-scale=1"/>
22 22 <meta charset="utf-8"/>
23 23
24 24 {% block head %}{% endblock %}
25 25 </head>
26 26 <body data-image-viewer="{{ image_viewer }}"
27 27 data-pow-difficulty="{{ pow_difficulty }}"
28 28 data-update-script="{% static 'js/updates.js' %}">
29 29 <script src="{% static 'js/jquery-2.2.0.min.js' %}"></script>
30 30
31 31 <header class="navigation_panel">
32 <a class="link" href="{% url 'index' %}">{% trans "All threads" %}</a>
32 <a class="link" href="{% url 'landing' %}">{{ site_name }}</a>
33 <a class="link" href="{% url 'index' %}">{% trans "All threads" %}</a>,
33 34 {% if tags_str %}
34 35 <form action="{% url 'index' %}" method="post" class="post-button-form">{% csrf_token %}
35 36 {% if only_favorites %}
36 37 <button name="method" value="toggle_fav" class="fav">β˜…</button>,
37 38 {% else %}
38 39 <button name="method" value="toggle_fav" class="not_fav">β˜…</button>,
39 40 {% endif %}
40 41 </form>
41 42 {{ tags_str|safe }},
42 {% else %}
43 {% trans 'Add tags' %} β†’
44 43 {% endif %}
45 44 <a href="{% url 'tags' 'required'%}" title="{% trans 'Tag management' %}">{% trans "tags" %}</a>,
46 45 <a href="{% url 'search' %}" title="{% trans 'Search' %}">{% trans 'search' %}</a>,
47 46 <a href="{% url 'feed' %}" title="{% trans 'Feed' %}">{% trans 'feed' %}</a>,
48 47 <a href="{% url 'random' %}" title="{% trans 'Random images' %}">{% trans 'images' %}</a>{% if has_fav_threads %},
49 48
50 49 <a href="{% url 'feed' %}?favorites" id="fav-panel-btn">{% trans 'favorites' %} <span id="new-fav-post-count" {% if not new_post_count %}style="display: none" {% endif %}>{{ new_post_count }}</span></a>
51 50 {% endif %}
52 51
53 52 {% if usernames %}
54 53 <a class="right-link link" href="{% url 'notifications' %}" title="{% trans 'Notifications' %}">
55 54 {% trans 'Notifications' %}
56 55 {% ifnotequal new_notifications_count 0 %}
57 56 (<b>{{ new_notifications_count }}</b>)
58 57 {% endifnotequal %}
59 58 </a>
60 59 {% endif %}
61 60
62 61 <a class="right-link link" href="{% url 'settings' %}">{% trans 'Settings' %}</a>
63 62 </header>
64 63
65 64 <div id="fav-panel"><div class="post">{% trans "Loading..." %}</div></div>
66 65
67 66 {% block content %}{% endblock %}
68 67
69 68 <script src="{% static 'js/3party/jquery-ui.min.js' %}"></script>
70 69 <script src="{% static 'js/jquery.mousewheel.js' %}"></script>
71 70 <script src="{% static 'js/3party/highlight.min.js' %}"></script>
72 71
73 72 <script src="{% url 'js_info_dict' %}"></script>
74 73
75 74 <script src="{% static 'js/popup.js' %}"></script>
76 75 <script src="{% static 'js/image.js' %}"></script>
77 76 <script src="{% static 'js/refpopup.js' %}"></script>
78 77 <script src="{% static 'js/main.js' %}"></script>
79 78
80 79 <footer class="navigation_panel">
81 80 {% block metapanel %}{% endblock %}
82 81 {% if rss_url %}
83 82 [<a href="{{ rss_url }}">RSS</a>]
84 83 {% endif %}
85 84 [<a href="{% url 'admin:index' %}">{% trans 'Admin' %}</a>]
86 85 [<a href="{% url 'index' %}?order=pub">{% trans 'New threads' %}</a>]
87 86 {% with ppd=posts_per_day|floatformat:2 %}
88 87 {% blocktrans %}Speed: {{ ppd }} posts per day{% endblocktrans %}
89 88 {% endwith %}
90 89 <a class="link" href="#top" id="up">{% trans 'Up' %}</a>
91 90 </footer>
92 91
93 92 </body>
94 93 </html>
@@ -1,37 +1,35 b''
1 1 {% extends "boards/base.html" %}
2 2
3 3 {% load i18n %}
4 4
5 5 {% block head %}
6 6 <title>{% trans 'Random images' %} - {{ site_name }}</title>
7 7 {% endblock %}
8 8
9 9 {% block content %}
10 10
11 11 {% if images %}
12 12 <div class="random-images-table">
13 13 <div>
14 14 {% for image in images %}
15 15 <div class="gallery_image">
16 {% autoescape off %}
17 {{ image.get_view }}
18 {% endautoescape %}
16 {{ image.get_view|safe }}
19 17 {% with image.get_random_associated_post as post %}
20 18 {{ post.get_link_view|safe }}
21 19 <div>
22 20 {% for tag in post.get_thread.get_required_tags.all %}
23 21 {{ tag.get_view|safe }}{% if not forloop.last %},{% endif %}
24 22 {% endfor %}
25 23 </div>
26 24 {% endwith %}
27 25 </div>
28 26 {% if forloop.counter|divisibleby:"3" %}
29 27 </div>
30 28 <div>
31 29 {% endif %}
32 30 {% endfor %}
33 31 </div>
34 32 </div>
35 33 {% endif %}
36 34
37 35 {% endblock %}
@@ -1,95 +1,97 b''
1 1 from django.conf.urls import url
2 2
3 3 import neboard
4 4
5 5 from boards import views
6 6 from boards.rss import AllThreadsFeed, TagThreadsFeed, ThreadPostsFeed
7 7 from boards.views import api, tag_threads, all_threads, \
8 8 settings, all_tags, feed, alias
9 9 from boards.views.authors import AuthorsView
10 10 from boards.views.notifications import NotificationView
11 11 from boards.views.static import StaticPageView
12 12 from boards.views.preview import PostPreviewView
13 13 from boards.views.sync import get_post_sync_data, response_get, response_list
14 14 from boards.views.random import RandomImageView
15 15 from boards.views.tag_gallery import TagGalleryView
16 16 from boards.views.translation import cached_javascript_catalog
17 17 from boards.views.search import BoardSearchView
18 from boards.views.landing import LandingView
18 19
19 20
20 21 js_info_dict = {
21 22 'packages': ('boards',),
22 23 }
23 24
24 25 urlpatterns = [
25 26 # /boards/
26 url(r'^$', all_threads.AllThreadsView.as_view(), name='index'),
27 url(r'^all/$', all_threads.AllThreadsView.as_view(), name='index'),
27 28
28 29 # /boards/tag/tag_name/
29 30 url(r'^tag/(?P<tag_name>\w+)/$', tag_threads.TagView.as_view(),
30 31 name='tag'),
31 32
32 33 # /boards/thread/
33 34 url(r'^thread/(?P<post_id>\d+)/$', views.thread.NormalThreadView.as_view(),
34 35 name='thread'),
35 36 url(r'^thread/(?P<post_id>\d+)/mode/gallery/$', views.thread.GalleryThreadView.as_view(),
36 37 name='thread_gallery'),
37 38 url(r'^thread/(?P<post_id>\d+)/mode/tree/$', views.thread.TreeThreadView.as_view(),
38 39 name='thread_tree'),
39 40 # /feed/
40 41 url(r'^feed/$', views.feed.FeedView.as_view(), name='feed'),
41 42
42 43 url(r'^settings/$', settings.SettingsView.as_view(), name='settings'),
43 44 url(r'^aliases/(?P<category>\w+)/$', alias.AliasesView.as_view(), name='aliases'),
44 45 url(r'^tags/(?P<query>\w+)?/?$', all_tags.AllTagsView.as_view(), name='tags'),
45 46 url(r'^authors/$', AuthorsView.as_view(), name='authors'),
46 47
47 48 url(r'^banned/$', views.banned.BannedView.as_view(), name='banned'),
48 49 url(r'^staticpage/(?P<name>\w+)/$', StaticPageView.as_view(),
49 50 name='staticpage'),
50 51
51 52 url(r'^random/$', RandomImageView.as_view(), name='random'),
52 53 url(r'^tag/(?P<tag_name>\w+)/gallery/$', TagGalleryView.as_view(), name='tag_gallery'),
53 54 url(r'^search/$', BoardSearchView.as_view(), name='search'),
55 url(r'^$', LandingView.as_view(), name='landing'),
54 56
55 57 # RSS feeds
56 58 url(r'^rss/$', AllThreadsFeed()),
57 59 url(r'^page/(?P<page>\d+)/rss/$', AllThreadsFeed()),
58 60 url(r'^tag/(?P<tag_name>\w+)/rss/$', TagThreadsFeed()),
59 61 url(r'^tag/(?P<tag_name>\w+)/page/(?P<page>\w+)/rss/$', TagThreadsFeed()),
60 62 url(r'^thread/(?P<post_id>\d+)/rss/$', ThreadPostsFeed()),
61 63
62 64 # i18n
63 65 url(r'^jsi18n/$', cached_javascript_catalog, js_info_dict,
64 66 name='js_info_dict'),
65 67
66 68 # API
67 69 url(r'^api/post/(?P<post_id>\d+)/$', api.get_post, name="get_post"),
68 70 url(r'^api/diff_thread/$', api.api_get_threaddiff, name="get_thread_diff"),
69 71 url(r'^api/threads/(?P<count>\w+)/$', api.api_get_threads,
70 72 name='get_threads'),
71 73 url(r'^api/tags/$', api.api_get_tags, name='get_tags'),
72 74 url(r'^api/thread/(?P<opening_post_id>\w+)/$', api.api_get_thread_posts,
73 75 name='get_thread'),
74 76 url(r'^api/add_post/(?P<opening_post_id>\w+)/$', api.api_add_post,
75 77 name='add_post'),
76 78 url(r'^api/notifications/(?P<username>\w+)/$', api.api_get_notifications,
77 79 name='api_notifications'),
78 80 url(r'^api/preview/$', api.api_get_preview, name='preview'),
79 81 url(r'^api/new_posts/$', api.api_get_new_posts, name='new_posts'),
80 82 url(r'^api/stickers/$', api.api_get_stickers, name='get_stickers'),
81 83
82 84 # Sync protocol API
83 85 url(r'^api/sync/list/$', response_list, name='api_sync_list'),
84 86 url(r'^api/sync/get/$', response_get, name='api_sync_get'),
85 87
86 88 # Notifications
87 89 url(r'^notifications/(?P<username>\w+)/$', NotificationView.as_view(), name='notifications'),
88 90 url(r'^notifications/$', NotificationView.as_view(), name='notifications'),
89 91
90 92 # Post preview
91 93 url(r'^preview/$', PostPreviewView.as_view(), name='preview'),
92 94 url(r'^post_xml/(?P<post_id>\d+)$', get_post_sync_data,
93 95 name='post_sync_data'),
94 96 ]
95 97
General Comments 0
You need to be logged in to leave comments. Login now