Archived
1
0
This commit is contained in:
Jeff Becker 2016-11-06 16:01:05 -05:00
parent 3c2da5f25b
commit 14c68abf9d
No known key found for this signature in database
GPG Key ID: AB950234D6EA286B
15 changed files with 206 additions and 22 deletions

1
.gitignore vendored
View File

@ -23,7 +23,6 @@ srndv2
# private key # private key
*.key *.key
*.txt
# certificates # certificates
certs certs

View File

@ -0,0 +1 @@
/** banners.js */

View File

@ -0,0 +1,13 @@
/** hooks.js */
onready_callbacks = [];
function onready(fnc) {
onready_callbacks.push(fnc);
}
function ready() {
for (var i = 0; i < onready_callbacks.length; i++) {
onready_callbacks[i]();
}
}

View File

@ -0,0 +1,8 @@
/** postform.js */
onready(function() {
var e = document.getElementById("postform");
if(!e) return; // no post form on page
});

View File

@ -0,0 +1 @@
/** settings.js */

View File

@ -4,6 +4,7 @@ body, html {
} }
div { div {
display: flex;
font-size: 12px; font-size: 12px;
font-family: sans; font-family: sans;
} }
@ -22,30 +23,81 @@ div {
color: #34345c color: #34345c
} }
#navbar_left { .navbar.left {
float: right; flex-basis: 100%;
} }
#navbar_frontpage {
flex-basis: 5%;
}
.navbar.right {
}
img.thumb { img.thumb {
margin: 10px;
max-width: 300px; max-width: 300px;
max-height: 200px; max-height: 200px;
} }
.thread { .thread {
padding: 5%; flex-direction: column;
background-color: rgba(214, 218, 240, 0.25);
border-radius: 10px;
margin: 1%;
width: 90%;
align-items: flex-begin;
}
#wrapper , #content {
flex-direction: column;
} }
.post { .post {
margin: 2%; margin: 1%;
background-color: #d6daf0; background-color: #d6daf0;
min-width: 500px; width: 90%;
width: 75%;
border: 2px solid #B7C5D9; border: 2px solid #B7C5D9;
border-radius: 2px 4px 4px 4px; border-radius: 2px 4px 4px 4px;
border-left: none; border-left: none;
border-top: none; border-top: none;
padding: 1%; padding: 1%;
flex-direction: column;
}
form {
padding: 5%;
width: 90%;
}
.postform {
flex-direction: column;
align-items: flex-start;
max-height: 25%;
width: 90%;
}
.pf-left {
flex-direction: column;
flex-basis: 50%;
width: 50%;
}
.postform > input {
align-items: flex-start;
}
.pf-item {
flex-basis: 100%;
flex-direction: row;
}
.pf-inner {
align-content: flex-start;
align-self: flex-end;
flex-direction: column;
width: 100%;
flex-basis: 100%;
} }
.post > .header { .post > .header {
@ -68,6 +120,7 @@ img.thumb {
color: #480188; color: #480188;
} }
.frontpage.posts { .frontpage.posts {
width: 50%; width: 50%;
padding-top: 10%; padding-top: 10%;

View File

@ -0,0 +1,6 @@
from django import template
register = template.Library()

View File

@ -5,9 +5,10 @@ from . import views
urlpatterns = [ urlpatterns = [
url(r'^ctl-(?P<page>[0-9]+)\.html$', views.modlog, name='old-modlog'), url(r'^ctl-(?P<page>[0-9]+)\.html$', views.modlog, name='old-modlog'),
url(r'^ctl/((?P<page>[0-9]+)/)?$', views.modlog, name='modlog'), url(r'^ctl/((?P<page>[0-9]+)/)?$', views.modlog, name='modlog'),
url(r'^overchan\.(?P<name>[a-zA-z0-9\.]+)-(?P<page>[0-9]+)\.html$', views.BoardView.as_view(), name='old-board'), url(r'^overchan\.(?P<name>[a-zA-Z0-9\.]+)-(?P<page>[0-9]+)\.html$', views.BoardView.as_view(), name='old-board'),
url(r'^overchan\.(?P<name>[a-zA-z0-9\.]+)/', views.BoardView.as_view(), name='board'), url(r'^overchan\.(?P<name>[a-zA-Z0-9\.]+)/', views.BoardView.as_view(), name='board-alt'),
url(r'^thread-(?P<op>[a-fA-F0-9\.]{40})\.html$', views.ThreadView.as_view(), name='old-thread'), url(r'^thread-(?P<op>[a-fA-F0-9\.]{40})\.html$', views.ThreadView.as_view(), name='old-thread'),
url(r'^b/(?P<name>[a-zA-Z0-9]+)/$', views.BoardView.as_view(), name='board'),
url(r'^t/(?P<op>[a-fA-F0-9\.]{40})/$', views.ThreadView.as_view(), name='thread'), url(r'^t/(?P<op>[a-fA-F0-9\.]{40})/$', views.ThreadView.as_view(), name='thread'),
url(r'^$', views.FrontPageView.as_view(), name='index'), url(r'^$', views.FrontPageView.as_view(), name='index'),
] ]

View File

@ -11,7 +11,7 @@ def hashid(msgid):
return h.hexdigest() return h.hexdigest()
def newsgroup_valid(name): def newsgroup_valid(name):
return re.match('overchan\.[a-zA-Z0-9\.]+[a-zA-Z0-9]$', name) is not None return re.match('overchan\.[a-zA-Z0-9\.]+[a-zA-Z0-9]$', name) is not None or name == 'ctl'
def hashfile(data): def hashfile(data):
h = hashlib.sha512() h = hashlib.sha512()

View File

@ -6,7 +6,23 @@ from django.views import generic
from .models import Post, Newsgroup from .models import Post, Newsgroup
class BoardView(generic.View): class Postable:
"""
postable view
checks captcha etc
"""
def post(self, request, **kwargs):
ctx = {
'error' : None
}
return render(request, 'frontend/postresult.html', ctx)
class BoardView(generic.View, Postable):
template_name = 'frontend/board.html' template_name = 'frontend/board.html'
context_object_name = 'threads' context_object_name = 'threads'
model = Post model = Post
@ -37,8 +53,7 @@ class BoardView(generic.View):
ctx['prevpage'] = reverse('board', args=[name]) + '?p={}'.format(page - 1) ctx['prevpage'] = reverse('board', args=[name]) + '?p={}'.format(page - 1)
return render(request, self.template_name, ctx) return render(request, self.template_name, ctx)
class ThreadView(generic.ListView, Postable):
class ThreadView(generic.ListView):
template_name = 'frontend/thread.html' template_name = 'frontend/thread.html'
model = Post model = Post
context_object_name = 'op' context_object_name = 'op'
@ -46,8 +61,6 @@ class ThreadView(generic.ListView):
def get_queryset(self): def get_queryset(self):
return get_object_or_404(self.model, posthash=self.kwargs['op']) return get_object_or_404(self.model, posthash=self.kwargs['op'])
class FrontPageView(generic.View): class FrontPageView(generic.View):
template_name = 'frontend/frontpage.html' template_name = 'frontend/frontpage.html'
model = Post model = Post

View File

@ -4,16 +4,22 @@
<head> <head>
<title>{% block title %} nntpchan {% endblock %}</title> <title>{% block title %} nntpchan {% endblock %}</title>
<link rel="stylesheet" type="text/css" href="{% static 'style.css' %}" /> <link rel="stylesheet" type="text/css" href="{% static 'style.css' %}" />
<script type="text/javascript" href="{% static 'nntpchan.js' %}"> <script type="text/javascript" src="{% static 'hooks.js' %}"></script>
</script> <script type="text/javascript" src="{% static 'postform.js' %}"></script>
<script type="text/javascript" src="{% static 'banners.js' %}"></script>
<script type="text/javascript" src="{% static 'settings.js' %}"></script>
</head> </head>
<body> <body>
<div id="wrapper"> <div id="wrapper">
<div id="navbar"> <div id="navbar">
<span id="navbar_frontpage"><a href="/">nntpchan</a></span> | <div class="navbar left">
<span id="navbar_title">{% block navbar_title %}{% endblock %}</span> | <div id="navbar_frontpage"><a href="/">nntpchan</a></div> |
<span id="navbar_links">{% block navbar_links %}{% endblock %}</span> | <div id="navbar_title">{% block navbar_title %}{% endblock %}</div>
<span id="navbar_left">{% block navbar_left %}| <a href="#" onclick="nntpchan_toggle_settings()">settings</a>{% endblock %}</span> <div id="navbar_links">{% block navbar_links %}{% endblock %}</div>
</div>
<div class="navbar right">
<div>{% block navbar_left %}| <a href="#" onclick="nntpchan_toggle_settings_pane()">settings</a>{% endblock %}</div>
</div>
</div> </div>
<div id="content"> <div id="content">
{% block content %} {% block content %}

View File

@ -12,7 +12,7 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<hr /> {% include "frontend/postform.html" %}
{% for op in threads %} {% for op in threads %}
<div id="{{op.posthash}}" class="thread"> <div id="{{op.posthash}}" class="thread">
<div class="post op"> <div class="post op">

View File

@ -0,0 +1,66 @@
{% load captcha %}
<div class="postform">
<form id="postform" method="post" action="">
{% csrf_token %}
<table class="postform">
<tbody>
<tr>
<th>
</th>
<td>
<span>
<input type="text" name="name" value="" id="postform_name" />
<span id="postform_msg"></span>
</span>
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="text" name="subject" value="" id="postform_subject" />
<input type="submit" value="{{button}}" class="button" id="postform_submit" />
</td>
</tr>
<tr>
<th>
</th>
<td>
<textarea id="postform_message" name="message" cols=40 rows=5></textarea>
</td>
</tr>
<tr>
<th>
</th>
<td>
<input class="postform_attachment" id="postform_attachments" type="file" name="attachment_uploaded" multiple />
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="checkbox" name="dubs" />
</td>
</tr>
<tr>
<th>
</th>
<td>
<img id="captcha_img" src="{{ captcha }}" alt="captcha" />
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="text" name="captcha" autocomplete="off" id="captcha_solution" height="175" width="350"/>
</td>
</tr>
</tbody>
</table>
</form>
</div>

View File

@ -0,0 +1,15 @@
{% extends "frontend/base.html" %}
{% block content %}
{% if error %}
<pre class="error"> failed to post {{error}} </pre>
{% else %}
{% if msgid %}
<pre class="posted"> posted as {{msgid}} </pre>
{% else %}
<pre class="posted"> message was not posted </pre>
{% endif %}
{% endif %}
{% endblock %}

View File

@ -0,0 +1,2 @@
captcha
django