diff --git a/boards/__init__.py b/boards/__init__.py new file mode 100644 diff --git a/boards/__init__.pyc b/boards/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb27594e598397f8c24513463d994c5fd2f87861 GIT binary patch literal 132 zc${PY%*&Pj%knvjB+{28Lh_kcgiKNDhrC)&&y!8Tq-X`emg>DTz6W y+4?z&N&0!IN%@IIDf(ctSU)~KGcU6wK3=b&vV;Su!zMRBr8Fni4rFdI$Q%GhIUDf+ diff --git a/boards/admin.py b/boards/admin.py new file mode 100644 --- /dev/null +++ b/boards/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from boards.models import Board, Thread, Post + +admin.site.register(Board) +admin.site.register(Thread) +admin.site.register(Post) diff --git a/boards/admin.pyc b/boards/admin.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69f03e0e97c3df64f4c48ad1de73c9bf7a4263f7 GIT binary patch literal 363 zc${5N!A`?447HnfOh`lh06w7N&|Enng!lk76;3^oF45L5X;6|Oapqq+aODHQ4j?A1 z_{lG_-?PQX>h$vcZM}h?C@60z<0FBlhhPC5LXUvV3$O(^0lffMLSKTbpsxT8!nABJ*zAJbj4rLM^CV9hn#MgFMqyr{9pFGyHPPyhe` diff --git a/boards/models.py b/boards/models.py new file mode 100644 --- /dev/null +++ b/boards/models.py @@ -0,0 +1,67 @@ +from django.db import models +from django.utils import timezone +from django.conf import settings + +class BoardManager(models.Manager): + def create_thread(self, board): + thread = self.create(board=board, posts=0, pub_date=timezone.now()) + + return thread + + def create_post(self, title, text, thread, image): + post = self.create(title=title, text=text, pub_date=timezone.now(), + thread=thread, image=image, poster_ip='0.0.0.0', + poster_user_agent='') + thread.posts = thread.posts + 1 + + return post + + def delete_post(self, post): + thread = post.thread + post.delete() + thread.posts = thread.posts - 1 + + if (thread.is_empty): + thread.delete() + + def delete_posts_by_ip(self, ip): + posts = self.filter(poster_ip=ip) + for post in posts: + self.delete_post(post) + +class Board(models.Model): + name = models.CharField(max_length=10) + description = models.CharField(max_length=50) + + def __unicode__(self): + return self.name + +class Thread(models.Model): + objects = BoardManager() + + board = models.ForeignKey(Board) + posts = models.IntegerField() + pub_date = models.DateTimeField() + + def __unicode__(self): + return str(self.id) + + def is_dead(self): + return self.posts >= settings.MAX_POSTS_PER_THREAD + + def is_empty(self): + return self.posts == 0 + +class Post(models.Model): + objects = BoardManager() + + title = models.CharField(max_length=100) + pub_date = models.DateTimeField() + text = models.TextField() + thread = models.ForeignKey(Thread) + image = models.ImageField(upload_to='images/src/') + poster_ip = models.IPAddressField() + poster_user_agent = models.TextField() + + def __unicode__(self): + return self.title + ' (' + self.text + ')' diff --git a/boards/models.pyc b/boards/models.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea9b230b06d658500475ff1e4f72cab3747d3980 GIT binary patch literal 3560 zc$}?Q*={366s_v^)?Si~X9*!J0~&#uK{22~2ni6AS;PoUh{}1%$cBBEa@ z5+O!X>`Nih_C(@|kuUar*Y-tH5~H%%FH^fDv=qaNIFuqPi{FGe7vlTy+Y7sz5)*gN8^B)ltmf!U2%UV&6*nd2An$ds)y@+1dafEW zOOwFLxddYq>e1MqvdSD0?R>!%QM;oU_00w9K-LL!AQ^ROj+{|H{D;2Ig(UbVn}GM^ zhnwQe=V1vUom2MuX+wOw0IQ%=t}@QUI3Y2pI|T!PW-%O(89l?i0>bu1geE*VB~fl- zs|o{c%a&w$G0$O`_D4DlZJism&orT?0#OR|u&HX}f>Hm=G6h0`(BRyP49Y<*sBsi= zlDu#=aCZDy^ixt?^myD;&eLQiPm_#j)ISLmogUfa7|r-2s2=jmzwF^^ z;o%;q@g0}Uu?yJY7CY*S$_vA38V{%|4DVqNj~&wC_SE@^u8qNe$+0JF1$p&nS{M2?VrmQ8eglzy$97~MMp zci!{VYI-!e0N{H8aGubGwMS1b*Uh&iyr$kkar+t~;%%D$E*7qELm9;;~a zF1fbQ+g{Sot;_mRa0?4Z-7O5bkD`(z-lG?qQwBenUeo^SB@yDbviv(0mZCcG!Kh-o@kHm ze?FISq8%I_6iVx@>MSj+YFb+BAuTmRBY_~10mB$}vh~=i9{EsvvlG2juNd(upVqKg(=q*6Wi2t_?i%1LfoNh7Sd2!1 zyoL#$Vhf2+ca}ah=aX*;>2P?Z3j93Lhh4mUXG6q(74e<*l$fk=VlaBlO+q#7ROxZK zLUks~OuW>rxe1%krg?lU1BP>J!tEvDjLMWw_o>L2pt~0Wy^fcYRLWt{Yl5qGZn1;clUftHVzl5_o3^$UHO;q%%wiQ*(FYhZUt zbKPPZd$rV_oQ3AK#ZyeB#c(un=p4=`E}U8oUa!H+l7=^`>>2X?7mGMEtabyPGfJsF zzXqL316qcJc%K$&8wJD_tFz2$t-@Dl%Bj)7>__CUv3Xmjv?y2iIy<*3x8zcnmh1N_ zPLpSYJ1!PeeT!D}O5o0hr2q6^xG(R5=KZVflJN1f-75WVrNfH=ex?H+3(+cXU)6%4 z+ReHr1?KVeScY_seizLT4}OUbejFSQqJ#Y~I(!oDKX}ZV@$<)&%Hez=xi_aON~ou; z6%4_p=U1`2rXsnxvr;hDO>xzFvkBaLYr$Zptn~q>SsR}~`CLXYna}jerB%k&H6~vD z^NoF=2KxSteZUk3)xxqBY^no;+$;gJ9h%)dk@yTS-JBH(Z@<|T!VfMaN1fsoUtczR zLU%)opPs2F)OsZ1fA!#fp{S0(*yHzGw7J&QMn$8OD4nfHbXmo6V}m-Sx35=4>Yzx$ zPF1r}M1QWLh&O5!;F3iHZeq)sUR#eh=1-`A1tbYM-SXF)i diff --git a/boards/urls.py b/boards/urls.py new file mode 100644 --- /dev/null +++ b/boards/urls.py @@ -0,0 +1,15 @@ +from django.conf.urls import patterns, url +from boards import views + +urlpatterns = patterns('', + # /boards/ + url(r'^$', views.index, name='index'), + # /boards/board_name/ + url(r'^(?P\w+)/$', views.board, name='board'), + # /boards/board_name/thread_id/ + url(r'^(?P\w+)/(?P\w+)/$', views.thread, + name='thread'), + # /boards/board_name/post/ + url(r'^(?P\w+)/post.html$', views.post, + name='post'), +) diff --git a/boards/urls.pyc b/boards/urls.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f2af1c8287a06e80673a385042e8a29032deb1b GIT binary patch literal 577 zc${^R%}&EG49A_c>%JK5!meB<(Fv)2fobprXeze~F=b0&9Zfqm=?3TBcu^jJ2LL;x za9SF>&ChoFx4o}Hueko4ui$s}(C*O82RezHK@Ol9qzp8NlmjEmA@@N0kov$B1L=X{ zAbn6iY+4|32XNqwVB5jK!A=9a4z?ZaHL&ks$H6m#hZdw=kOO!K&rweHjVt8%WjpA$ z!dg`o#(H?Dt2|^BX`$O?YHuvHV<`J+Y<+wcLMs=}3aQ@Ah$7+be7Y<}B^MN(J??KN z@z^CfY9^O?)GYmoi$F#dCx$ znS`21Tw}qXsDzqINMu4VX_KRg*#2=6&16EV{&%jMcwK50@9Ij5T)f7)SjL5N_r}ND gWBPBjeRngS>QdIZnvnuS0!M7f1Ad9m1q;xA03&XCumAu6 diff --git a/boards/views.py b/boards/views.py new file mode 100644 --- /dev/null +++ b/boards/views.py @@ -0,0 +1,49 @@ +from django.http import HttpResponse +from django.shortcuts import render + +from boards.models import Board, Thread, Post + +def index(request): + return HttpResponse('Imageboard, motherfucker! Do you post to it?!') + +def board(request, board_name): + board = [] + threads = [] + + boards = Board.objects.filter(name=board_name) + if len(boards) > 0: + board = boards[0] + + if board != []: + threads = Thread.objects.filter(board=board) + + context = { + 'board': board, + 'threads': threads, + } + + return render(request, 'boards/board.html', context) + +def thread(request, board_name, thread_id): + thread = [] + posts = [] + + threads = Thread.objects.filter(id=thread_id) + if len(threads) > 0: + thread = threads[0] + posts = Post.objects.filter(thread=thread) + + context = { + 'thread': thread, + 'posts': posts, + } + + return render(request, 'boards/thread.html', context) + +def post(request): + title = request.POST['title'] + text = request.POST['text'] + + image = request.POST['image'] + + post = Post.objects.create_post(title=title, text=text, image=image) diff --git a/boards/views.pyc b/boards/views.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f14e017d4da09adc1df8f343401b3142668a3f1c GIT binary patch literal 1698 zc$}S-OK;Oa5XWb|w)1EsLPRSfIHU)ph(~kl2|)!MKtiQ*%OwY@)Lt4VegyBPv{G^^ z2fisEfDZsOvv!(X6Umd^wP$wb|C?R;x7Gai?9XWk<!6y=s0Hgwj0tC$+ zNE}Ed45gh*NL)xg7(t%QLO)s*k2nS)_`-q`8OYT|O!zesex9)F?784o`D!LUIvhG4H9E zCi!qNcLKMh^%MOH?Wc5fr7kJZ%U+tBu`0gL!>K9`dLQ!MZ9ebKFka8(z1X}x;8X%q z$tG3fq<+kmHho?tqo1Q0jPq0tuIEKGN=DN`GP)dOcAEiPJ-Ck5PklJMSlW|9GL>^eP-ed-`Nu#(QqR`$w}j2hYX#@z+GXe zRTzR61#YaOU&K*Bu!By;BY02=zm@tF>^1FMqMMQeFJ~1^LxksTOu<%Q@-qR%t|&QFfIhV!TtiC))Rm zdYl&~oEyz}O>5N{hiM+EMDr=NJ;Akci|~@{vSPt+UAK~vss(RQ9X K4cX{4+W!H$ls+&3 diff --git a/images/src/banana-boy-worm-from-worms-2992.png b/images/src/banana-boy-worm-from-worms-2992.png new file mode 100755 index 0000000000000000000000000000000000000000..2e46497bef5760b7825b08fa916bdff73aec0477 GIT binary patch literal 20958 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

$8L_Ev|Wrud+HA)3$GO??ysZE-R{8- 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 diff --git a/neboard/settings.py b/neboard/settings.py new file mode 100644 --- /dev/null +++ b/neboard/settings.py @@ -0,0 +1,156 @@ +# Django settings for neboard project. + +DEBUG = True +TEMPLATE_DEBUG = DEBUG + +ADMINS = ( + # ('Your Name', 'your_email@example.com'), +) + +MANAGERS = ADMINS + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': 'database.db', # Or path to database file if using sqlite3. + 'USER': '', # Not used with sqlite3. + 'PASSWORD': '', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# In a Windows environment this must be set to your system time zone. +TIME_ZONE = 'Europe/Kiev' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'en-us' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True + +# If you set this to False, Django will not format dates, numbers and +# calendars according to the current locale. +USE_L10N = True + +# If you set this to False, Django will not use timezone-aware datetimes. +USE_TZ = True + +# Absolute filesystem path to the directory that will hold user-uploaded files. +# Example: "/home/media/media.lawrence.com/media/" +MEDIA_ROOT = '' + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash. +# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" +MEDIA_URL = '' + +# Absolute path to the directory static files should be collected to. +# Don't put anything in this directory yourself; store your static files +# in apps' "static/" subdirectories and in STATICFILES_DIRS. +# Example: "/home/media/media.lawrence.com/static/" +STATIC_ROOT = '' + +# URL prefix for static files. +# Example: "http://media.lawrence.com/static/" +STATIC_URL = '/static/' + +# Additional locations of static files +STATICFILES_DIRS = ( + # Put strings here, like "/home/html/static" or "C:/www/django/static". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. +) + +# List of finder classes that know how to find static files in +# various locations. +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +# 'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +# Make this unique, and don't share it with anybody. +SECRET_KEY = '@1rc$o(7=tt#kd+4s$u6wchm**z^)4x90)7f6z(i&55@o11*8o' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', +# 'django.template.loaders.eggs.Loader', +) + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + # Uncomment the next line for simple clickjacking protection: + # 'django.middleware.clickjacking.XFrameOptionsMiddleware', +) + +ROOT_URLCONF = 'neboard.urls' + +# Python dotted path to the WSGI application used by Django's runserver. +WSGI_APPLICATION = 'neboard.wsgi.application' + +TEMPLATE_DIRS = ( + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + 'templates', +) + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + # Uncomment the next line to enable the admin: + 'django.contrib.admin', + # Uncomment the next line to enable admin documentation: + # 'django.contrib.admindocs', + 'boards', +) + +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error when DEBUG=False. +# See http://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +# Custom imageboard settings +MAX_POSTS_PER_THREAD = 100 diff --git a/neboard/settings.pyc b/neboard/settings.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1091123bad159c6b36c0e4b1e2ffc1feca10d78 GIT binary patch literal 2970 zc%0=H+j7%J^f*qO#1NoB%dIn=DU>>)$fN`ZO4~tLve6)4Mp8C~RRocm?>oK^AHt@6*G{L<~i^tXZI2@d(B03ZOu0*C^H zE5P?4EP^OPxC(Ir;u3HGUVs`$S`n93;A{C(%9r(g*}!EJYT+92GK4602EujVXCd6s z1~&Cv*7F%aiSVqRxAc4t_!flcfj@xo0`MAy9{|4q;YHy45MBcQ5W>sAuR{1C@M{o$ z1pE<%SAc&7;Z=y&$Pm8?HE|92EvS*_1>m0nzm0Bvj-!$zi@>*m?`Y%zIS|e70RIA) zyEu#)*Ii9Uc*>7%^D093aO`53*MWZt;SJ#T!LK}~OkT%{|HMXv)Zjg%$NDeDh)YAh zN@6AMs}hp!cGGFw@(gh@#d=H%;M<;}GwPbY|Dxkr8vCr{2YS=( zc!63cE#i<(5~VfTlPn#J>ho9}%Qb|>=s!GLF+^@>}b3gm(NM&))$VrEB zBBXH`kGROB(Ll(5Bb697a?JkUlQYL-E6zk;rCBWGRJKOfZ8z)RN-O){D0TBCzq2QA zO=>6oqv6iZ+aI_0UO&3Gy?{)C&2#}S{qb}F)9U>I|rh!d6x3~@M2M@C&Qtr=eKEy;qAGEPTwQQXgQ3xe-4 zBeO%Jj?;IsI9cFcl593nM~k8+!eWH^$20gV7l-H$8;IYz*vfGWf@e{1Bzh^!xG~8R zDX%UdPUIk_6ed%HYLhPOG{;h2TJEsC@kczZ=(u__M!75R&!@b+gchsiLZ=Zfmf@0X zx=bhI!+50YQ%5RwWgX+qpeQK?JeI7Nh)BGSrHV&`C`ktcq{~m|$|fpKBwn?F;fYrh zyk(Z?O$H5?U^FYpR@qjRqAVvyoT$+uk+nH=PN7Ccg=>3W$J4t+9E)VR6_cE{hb&H> zu@N3%rUm*5lTuMPAWEbole&={C(o9iamgjCv{X@D`O&Qzhclus1N zztKQ)!~b+EsI0wX<^SCeD)e@Eba^T?{pU;EqpM%}`1FkpvWd_|W7$s+nu;nRuv=Z% z4D2XJQA;qbmecli3AN0&*|a@hmyl%!=2O$Rb0~0Hb`*Bnw%S6-HQUVtWR2<_%hvVe zJE+vLv>JTdBWL$vdj`0>_uASP0YRwBWXrZ3Gx9o}KKtx#i3>Gx@QN`bNdG^JIjFEF*VOcvhG-xYril(jL5|g5)7K2 z3bIc|>z#H(3%~H2PGokwu2V;2owiQKJg4LeWf}7sn67JE#Ov!LXv`X++iBuAQd3>l z3I9Io;x~^Ub!{&So_V%uEi@yVbd^_+(xIpxPcqID_OhC=UUm9v%~sS-om(2?H#+ZM z4^uu##J5G#@fxR6p|nz3Ev*y_#lrgRe{O?tI95wV9BZYL-fcnw_p3BRA^#&>BeXe2ff{a0WHOQ$CH4Hs5jOBBDU)vc3Xcp_MDoa~e@{31FByo$a4A)izClIGmX_QkDg*FL9I zNkk=)mz-)Y{?&x8*_27&8NJ*Gry5_oz3#$@1T;Y>KulqA0H-N(V*WG!CYs{aSzYY= pPDvx*3L`f~tCP^*o2XX1_w*sR)~Vj;JCf&Vge$RRb3UG3vL9tVWIF%= diff --git a/neboard/wsgi.py b/neboard/wsgi.py new file mode 100644 --- /dev/null +++ b/neboard/wsgi.py @@ -0,0 +1,28 @@ +""" +WSGI config for neboard project. + +This module contains the WSGI application used by Django's development server +and any production WSGI deployments. It should expose a module-level variable +named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover +this application via the ``WSGI_APPLICATION`` setting. + +Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework. + +""" +import os + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "neboard.settings") + +# This application object is used by any WSGI server configured to use this +# file. This includes Django's development server, if the WSGI_APPLICATION +# setting points here. +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() + +# Apply WSGI middleware here. +# from helloworld.wsgi import HelloWorldApplication +# application = HelloWorldApplication(application) diff --git a/neboard/wsgi.pyc b/neboard/wsgi.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b80c30c85c5d26d06705001043ad3a8391742637 GIT binary patch literal 1029 zc${@p!EVz)5M8HDK?X!65a+p3A#i>GAqpu~P)RG23aJ-+u6M27wbPt?=O>Z) z0X_g`9g7B4Sn{6vmoYR5HtU zSY%mpMj&=Sr%BP#}^l8laI&q z$@!G>9eOWyK^k4UhAXv!jcH&lm4cGD*d;no6@s8!PWMGC(c)`ZG#;b}uAGT0S(F|s zeofg(?7J9A|V%2hcWed_X+8Ld}c`=Lj-KRv^2xD zvDYM{{7u)?zo6|Le?Fd`o~N^u`Ft`xouyyS$Cqa(?vRf96-|2i-BCnN|C~&LK3%&) zraQHc9)#0i(o~o{O+BqWGp=)?Zl$H2j>GqWUf_~9%KK17be$x*v6uwRuU(Z#WOl*B z$9ZSmD>9?fR5)rIE4bp{{ board.name }} board here. Its name is {{ board.description }}. + This board has the following threads: + + + {% for thread in threads %} + + {% endfor %} +
+ {{ thread.id }} +
+ +{% else %} + You see no board here. +{% endif %} diff --git a/templates/boards/thread.html b/templates/boards/thread.html new file mode 100644 --- /dev/null +++ b/templates/boards/thread.html @@ -0,0 +1,16 @@ +{% extends 'posting_general.html' %} +{% load url from future %} + +{% block posts %} +{% if thread %} + + {% for post in posts %} + + {% endfor %} +
+ {{ thread.text }} +
+{% else %} + You see no thread here. +{% endif %} +{% endblock posts %} diff --git a/templates/posting_general.html b/templates/posting_general.html new file mode 100644 --- /dev/null +++ b/templates/posting_general.html @@ -0,0 +1,8 @@ + + +

+
+
+
+ +