remove django-environ and more work on irc bot
This commit is contained in:
parent
57c6037e37
commit
ea14ae5e38
|
@ -1,36 +0,0 @@
|
||||||
### set database url and allowed_hosts here
|
|
||||||
DATABASE_URL=postgres://username:password@host:port/database
|
|
||||||
ALLOWED_HOSTS=localhost,127.0.0.1
|
|
||||||
DEBUG=True
|
|
||||||
|
|
||||||
### changes below here are only needed for production
|
|
||||||
SECRET_KEY=somethingverysecretandunique
|
|
||||||
|
|
||||||
EMAIL_HOST='mailhost.example.com'
|
|
||||||
EMAIL_PORT=587
|
|
||||||
EMAIL_HOST_USER='mymailuser'
|
|
||||||
EMAIL_HOST_PASSWORD='mymailpassword'
|
|
||||||
EMAIL_USE_TLS=True
|
|
||||||
DEFAULT_FROM_EMAIL='noreply@example.com'
|
|
||||||
ARCHIVE_EMAIL='archive@example.com'
|
|
||||||
|
|
||||||
ADMINS=(
|
|
||||||
('bornhack sysadm', 'sysadm@bornhack.org'),
|
|
||||||
)
|
|
||||||
|
|
||||||
EPAY_MERCHANT_NUMBER=123
|
|
||||||
EPAY_MD5_SECRET='abc'
|
|
||||||
TICKET_CATEGORY_ID='304e9b44-0b48-472d-a05b-963e52614a69'
|
|
||||||
COINIFY_API_KEY='123'
|
|
||||||
COINIFY_API_SECRET='123'
|
|
||||||
COINIFY_IPN_SECRET='123'
|
|
||||||
PDF_LETTERHEAD_FILENAME='letterhead.pdf'
|
|
||||||
MEDIA_ROOT='/path/to/media/root/outside/django/root/'
|
|
||||||
BANKACCOUNT_IBAN='123'
|
|
||||||
BANKACCOUNT_SWIFTBIC='123'
|
|
||||||
BANKACCOUNT_REG='123'
|
|
||||||
BANKACCOUNT_ACCOUNT='123'
|
|
||||||
TIME_ZONE='Europe/Copenhagen'
|
|
||||||
SCHEDULE_MIDNIGHT_OFFSET_HOURS=6
|
|
||||||
SCHEDULE_TIMESLOT_LENGTH_MINUTES=30
|
|
||||||
|
|
65
src/bornhack/environment_settings.py
Normal file
65
src/bornhack/environment_settings.py
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
# make this a long 100+ chars random string
|
||||||
|
SECRET_KEY = 'secret'
|
||||||
|
|
||||||
|
# debug settings - remember to set allowed_hosts if debug is disabled
|
||||||
|
DEBUG = True
|
||||||
|
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
|
||||||
|
|
||||||
|
# Database settings
|
||||||
|
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
|
'NAME': 'bornhackdb',
|
||||||
|
'USER': 'bornhack',
|
||||||
|
'PASSWORD': 'bornhack',
|
||||||
|
'HOST': '127.0.0.1',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
### changes below here are only needed for production
|
||||||
|
|
||||||
|
# email settings
|
||||||
|
EMAIL_HOST='mailhost.example.com'
|
||||||
|
EMAIL_PORT=587
|
||||||
|
EMAIL_HOST_USER='mymailuser'
|
||||||
|
EMAIL_HOST_PASSWORD='mymailpassword'
|
||||||
|
EMAIL_USE_TLS=True
|
||||||
|
DEFAULT_FROM_EMAIL='noreply@example.com'
|
||||||
|
ARCHIVE_EMAIL='archive@example.com'
|
||||||
|
|
||||||
|
ADMINS=(
|
||||||
|
('sysadm', 'sysadm@example.com')
|
||||||
|
)
|
||||||
|
|
||||||
|
# misc settings
|
||||||
|
TIME_ZONE='Europe/Copenhagen'
|
||||||
|
MEDIA_ROOT='/path/to/media/root/outside/django/root/'
|
||||||
|
PDF_ARCHIVE_PATH='/usr/local/www/pdf_archive/'
|
||||||
|
|
||||||
|
# PSP settings
|
||||||
|
EPAY_MERCHANT_NUMBER=123
|
||||||
|
EPAY_MD5_SECRET='abc'
|
||||||
|
COINIFY_API_KEY='123'
|
||||||
|
COINIFY_API_SECRET='123'
|
||||||
|
COINIFY_IPN_SECRET='123'
|
||||||
|
|
||||||
|
# shop settings
|
||||||
|
PDF_LETTERHEAD_FILENAME='letterhead.pdf'
|
||||||
|
BANKACCOUNT_IBAN='123'
|
||||||
|
BANKACCOUNT_SWIFTBIC='123'
|
||||||
|
BANKACCOUNT_REG='123'
|
||||||
|
BANKACCOUNT_ACCOUNT='123'
|
||||||
|
|
||||||
|
# schedule settings
|
||||||
|
SCHEDULE_MIDNIGHT_OFFSET_HOURS=6
|
||||||
|
SCHEDULE_TIMESLOT_LENGTH_MINUTES=30
|
||||||
|
|
||||||
|
# irc bot settings
|
||||||
|
IRCBOT_CHECK_MESSAGE_INTERVAL_SECONDS=60
|
||||||
|
IRCBOT_NICK='BornHack'
|
||||||
|
IRCBOT_SCHEDULE_ANNOUNCE_CHANNEL='#test'
|
||||||
|
IRCBOT_SERVER_HOSTNAME='ircd.tyknet.dk'
|
||||||
|
IRCBOT_SERVER_PORT=6697
|
||||||
|
IRCBOT_SERVER_USETLS=True
|
||||||
|
|
65
src/bornhack/environment_settings.py.dist
Normal file
65
src/bornhack/environment_settings.py.dist
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
# make this a long 100+ chars random string
|
||||||
|
SECRET_KEY = 'secret'
|
||||||
|
|
||||||
|
# debug settings - remember to set allowed_hosts if debug is disabled
|
||||||
|
DEBUG = True
|
||||||
|
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
|
||||||
|
|
||||||
|
# Database settings
|
||||||
|
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
|
'NAME': 'bornhackdb',
|
||||||
|
'USER': 'bornhack',
|
||||||
|
'PASSWORD': 'bornhack',
|
||||||
|
'HOST': '127.0.0.1',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
### changes below here are only needed for production
|
||||||
|
|
||||||
|
# email settings
|
||||||
|
EMAIL_HOST='mailhost.example.com'
|
||||||
|
EMAIL_PORT=587
|
||||||
|
EMAIL_HOST_USER='mymailuser'
|
||||||
|
EMAIL_HOST_PASSWORD='mymailpassword'
|
||||||
|
EMAIL_USE_TLS=True
|
||||||
|
DEFAULT_FROM_EMAIL='noreply@example.com'
|
||||||
|
ARCHIVE_EMAIL='archive@example.com'
|
||||||
|
|
||||||
|
ADMINS=(
|
||||||
|
('sysadm', 'sysadm@example.com')
|
||||||
|
)
|
||||||
|
|
||||||
|
# misc settings
|
||||||
|
TIME_ZONE='Europe/Copenhagen'
|
||||||
|
MEDIA_ROOT='/path/to/media/root/outside/django/root/'
|
||||||
|
PDF_ARCHIVE_PATH='/usr/local/www/pdf_archive/'
|
||||||
|
|
||||||
|
# PSP settings
|
||||||
|
EPAY_MERCHANT_NUMBER=123
|
||||||
|
EPAY_MD5_SECRET='abc'
|
||||||
|
COINIFY_API_KEY='123'
|
||||||
|
COINIFY_API_SECRET='123'
|
||||||
|
COINIFY_IPN_SECRET='123'
|
||||||
|
|
||||||
|
# shop settings
|
||||||
|
PDF_LETTERHEAD_FILENAME='letterhead.pdf'
|
||||||
|
BANKACCOUNT_IBAN='123'
|
||||||
|
BANKACCOUNT_SWIFTBIC='123'
|
||||||
|
BANKACCOUNT_REG='123'
|
||||||
|
BANKACCOUNT_ACCOUNT='123'
|
||||||
|
|
||||||
|
# schedule settings
|
||||||
|
SCHEDULE_MIDNIGHT_OFFSET_HOURS=6
|
||||||
|
SCHEDULE_TIMESLOT_LENGTH_MINUTES=30
|
||||||
|
|
||||||
|
# irc bot settings
|
||||||
|
IRCBOT_CHECK_MESSAGE_INTERVAL_SECONDS=60
|
||||||
|
IRCBOT_NICK='BornHack'
|
||||||
|
IRCBOT_SCHEDULE_ANNOUNCE_CHANNEL='#test'
|
||||||
|
IRCBOT_SERVER_HOSTNAME='ircd.tyknet.dk'
|
||||||
|
IRCBOT_SERVER_PORT=6697
|
||||||
|
IRCBOT_SERVER_USETLS=True
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
from .environment_settings import *
|
||||||
import environ
|
|
||||||
env = environ.Env()
|
|
||||||
environ.Env.read_env()
|
|
||||||
|
|
||||||
def local_dir(entry):
|
def local_dir(entry):
|
||||||
return os.path.join(
|
return os.path.join(
|
||||||
|
@ -13,15 +10,9 @@ def local_dir(entry):
|
||||||
WSGI_APPLICATION = 'bornhack.wsgi.application'
|
WSGI_APPLICATION = 'bornhack.wsgi.application'
|
||||||
ROOT_URLCONF = 'bornhack.urls'
|
ROOT_URLCONF = 'bornhack.urls'
|
||||||
|
|
||||||
SECRET_KEY = env('SECRET_KEY')
|
|
||||||
ALLOWED_HOSTS = env('ALLOWED_HOSTS').split(',')
|
|
||||||
|
|
||||||
SITE_ID = 1
|
SITE_ID = 1
|
||||||
|
|
||||||
DATABASES = {
|
|
||||||
'default': env.db(),
|
|
||||||
}
|
|
||||||
|
|
||||||
ADMINS = (
|
ADMINS = (
|
||||||
('bornhack sysadm', 'sysadm@bornhack.org'),
|
('bornhack sysadm', 'sysadm@bornhack.org'),
|
||||||
)
|
)
|
||||||
|
@ -54,9 +45,7 @@ INSTALLED_APPS = [
|
||||||
STATIC_URL = '/static/'
|
STATIC_URL = '/static/'
|
||||||
STATIC_ROOT = local_dir('static')
|
STATIC_ROOT = local_dir('static')
|
||||||
STATICFILES_DIRS = [local_dir('static_src')]
|
STATICFILES_DIRS = [local_dir('static_src')]
|
||||||
MEDIA_ROOT = env('MEDIA_ROOT')
|
|
||||||
LANGUAGE_CODE = 'en-us'
|
LANGUAGE_CODE = 'en-us'
|
||||||
TIME_ZONE = env('TIME_ZONE')
|
|
||||||
#USE_I18N = True
|
#USE_I18N = True
|
||||||
#USE_L10N = True
|
#USE_L10N = True
|
||||||
USE_TZ = True
|
USE_TZ = True
|
||||||
|
@ -84,18 +73,6 @@ TEMPLATES = [
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
MIDDLEWARE_CLASSES = [
|
|
||||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
||||||
'django.middleware.common.CommonMiddleware',
|
|
||||||
'django.middleware.csrf.CsrfViewMiddleware',
|
|
||||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
|
||||||
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
|
|
||||||
'django.contrib.messages.middleware.MessageMiddleware',
|
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
|
||||||
'django.middleware.security.SecurityMiddleware',
|
|
||||||
]
|
|
||||||
|
|
||||||
LOGIN_REDIRECT_URL = 'profiles:detail'
|
LOGIN_REDIRECT_URL = 'profiles:detail'
|
||||||
|
|
||||||
AUTHENTICATION_BACKENDS = (
|
AUTHENTICATION_BACKENDS = (
|
||||||
|
@ -118,38 +95,10 @@ BOOTSTRAP3 = {
|
||||||
'javascript_url': '/static/js/bootstrap.min.js'
|
'javascript_url': '/static/js/bootstrap.min.js'
|
||||||
}
|
}
|
||||||
|
|
||||||
EPAY_MERCHANT_NUMBER = env('EPAY_MERCHANT_NUMBER')
|
|
||||||
EPAY_MD5_SECRET = env('EPAY_MD5_SECRET')
|
|
||||||
|
|
||||||
COINIFY_API_KEY = env('COINIFY_API_KEY')
|
|
||||||
COINIFY_API_SECRET = env('COINIFY_API_SECRET')
|
|
||||||
COINIFY_IPN_SECRET = env('COINIFY_IPN_SECRET')
|
|
||||||
|
|
||||||
LETTERHEAD_PDF_PATH = os.path.join(local_dir('static_src'), 'pdf', env('PDF_LETTERHEAD_FILENAME'))
|
|
||||||
PDF_ARCHIVE_PATH='/usr/local/www/pdf_archive/'
|
|
||||||
|
|
||||||
BANKACCOUNT_IBAN = env('BANKACCOUNT_IBAN')
|
|
||||||
BANKACCOUNT_SWIFTBIC = env('BANKACCOUNT_SWIFTBIC')
|
|
||||||
BANKACCOUNT_REG = env('BANKACCOUNT_REG')
|
|
||||||
BANKACCOUNT_ACCOUNT = env('BANKACCOUNT_ACCOUNT')
|
|
||||||
|
|
||||||
TICKET_CATEGORY_ID = env('TICKET_CATEGORY_ID')
|
|
||||||
|
|
||||||
DEBUG = env('DEBUG')
|
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
||||||
INSTALLED_APPS += ['debug_toolbar', ]
|
INSTALLED_APPS += ['debug_toolbar', ]
|
||||||
MIDDLEWARE_CLASSES += ['debug_toolbar.middleware.DebugToolbarMiddleware', ]
|
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
|
||||||
|
|
||||||
else:
|
|
||||||
EMAIL_HOST = env('EMAIL_HOST')
|
|
||||||
EMAIL_PORT = env('EMAIL_PORT')
|
|
||||||
EMAIL_HOST_USER = env('EMAIL_HOST_USER')
|
|
||||||
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD')
|
|
||||||
EMAIL_USE_TLS = env('EMAIL_USE_TLS')
|
|
||||||
DEFAULT_FROM_EMAIL = env('DEFAULT_FROM_EMAIL')
|
|
||||||
SERVER_EMAIL = env('DEFAULT_FROM_EMAIL')
|
|
||||||
ARCHIVE_EMAIL = env('ARCHIVE_EMAIL')
|
|
||||||
|
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
'version': 1,
|
'version': 1,
|
||||||
|
@ -173,7 +122,3 @@ LOGGING = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# schedule settings
|
|
||||||
SCHEDULE_MIDNIGHT_OFFSET_HOURS=int(env('SCHEDULE_MIDNIGHT_OFFSET_HOURS'))
|
|
||||||
SCHEDULE_TIMESLOT_LENGTH_MINUTES=int(env('SCHEDULE_TIMESLOT_LENGTH_MINUTES'))
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from .models import *
|
||||||
|
|
||||||
|
admin.site.register(OutgoingIrcMessage)
|
||||||
|
|
||||||
# Register your models here.
|
|
||||||
|
|
|
@ -63,29 +63,39 @@ class Plugin(object):
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
print("inside on_kick(), kwargs: %s" % kwargs)
|
print("inside on_kick(), kwargs: %s" % kwargs)
|
||||||
|
|
||||||
|
|
||||||
###############################################################################################
|
###############################################################################################
|
||||||
### custom irc3 methods
|
### custom irc3 methods
|
||||||
|
|
||||||
@irc3.extend
|
@irc3.extend
|
||||||
def get_outgoing_messages(self):
|
def get_outgoing_messages(self):
|
||||||
"""
|
"""
|
||||||
This method gets unprocessed OutgoingIrcMessage objects and attempts to send them to
|
This method gets unprocessed OutgoingIrcMessage objects and attempts to send them to
|
||||||
the target channel. Messages are skipped if the bot is not in the channel.
|
the target channel. Messages are skipped if the bot is not in the channel.
|
||||||
"""
|
"""
|
||||||
# TODO: handle privmsg to users
|
|
||||||
# TODO: set a timeout for messages.. a few minutes maybe?
|
|
||||||
# TODO: make sleep time configurable
|
|
||||||
print("inside get_outgoing_messages()")
|
print("inside get_outgoing_messages()")
|
||||||
for msg in OutgoingIrcMessage.objects.filter(processed=False).order_by('created_date'):
|
for msg in OutgoingIrcMessage.objects.filter(processed=False).order_by('created_date'):
|
||||||
|
# if this message expired mark it as expired and processed without doing anything
|
||||||
|
if msg.timeout < timezone.now():
|
||||||
|
# this message is expired
|
||||||
|
msg.expired=True
|
||||||
|
msg.processed=True
|
||||||
|
msg.save()
|
||||||
|
continue
|
||||||
|
|
||||||
|
# is this message for a channel or a nick?
|
||||||
if msg.target[0] == "#" and msg.target in self.bot.channels:
|
if msg.target[0] == "#" and msg.target in self.bot.channels:
|
||||||
print("sending privmsg to %s: %s" % (msg.target, msg.message))
|
print("sending privmsg to %s: %s" % (msg.target, msg.message))
|
||||||
self.bot.privmsg(msg.target, msg.message)
|
self.bot.privmsg(msg.target, msg.message)
|
||||||
msg.processed=True
|
msg.processed=True
|
||||||
msg.save()
|
msg.save()
|
||||||
|
elif msg.target:
|
||||||
|
self.bot.privmsg(msg.target, msg.message)
|
||||||
|
msg.processed=True
|
||||||
|
msg.save()
|
||||||
else:
|
else:
|
||||||
print("skipping message to channel %s because the bot is not in the channel" % msg.target)
|
print("skipping message to %s" % msg.target)
|
||||||
|
|
||||||
# call this function again in 60 seconds
|
# call this function again in 60 seconds
|
||||||
self.bot.loop.call_later(60, self.bot.get_outgoing_messages)
|
self.bot.loop.call_later(settings.IRCBOT_CHECK_MESSAGE_INTERVAL_SECONDS, self.bot.get_outgoing_messages)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,11 @@ class Command(BaseCommand):
|
||||||
self.output('IRC bot worker running...')
|
self.output('IRC bot worker running...')
|
||||||
# connect to IRC
|
# connect to IRC
|
||||||
config = {
|
config = {
|
||||||
'nick': 'BornHack',
|
'nick': settings.IRCBOT_NICK,
|
||||||
'autojoins': ['#tirsdagsfilm'],
|
'autojoins': [settings.IRCBOT_SCHEDULE_ANNOUNCE_CHANNEL],
|
||||||
'host': 'ircd.tyknet.dk',
|
'host': settings.IRCBOT_SERVER_HOSTNAME,
|
||||||
'port': 6697,
|
'port': settings.IRCBOT_SERVER_PORT,
|
||||||
'ssl': True,
|
'ssl': settings.IRCBOT_SERVER_USETLS,
|
||||||
'timeout': 30,
|
'timeout': 30,
|
||||||
'includes': [
|
'includes': [
|
||||||
'ircbot.irc3module',
|
'ircbot.irc3module',
|
||||||
|
|
23
src/ircbot/migrations/0002_outgoingircmessage_timeout.py
Normal file
23
src/ircbot/migrations/0002_outgoingircmessage_timeout.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-01-31 17:49
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
from django.utils.timezone import utc
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ircbot', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='outgoingircmessage',
|
||||||
|
name='timeout',
|
||||||
|
field=models.DateTimeField(default=datetime.datetime(2017, 1, 31, 17, 49, 36, 925459, tzinfo=utc)),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
20
src/ircbot/migrations/0003_outgoingircmessage_expired.py
Normal file
20
src/ircbot/migrations/0003_outgoingircmessage_expired.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-01-31 20:03
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ircbot', '0002_outgoingircmessage_timeout'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='outgoingircmessage',
|
||||||
|
name='expired',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,4 +1,4 @@
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
from utils.models import UUIDModel, CreatedUpdatedModel
|
from utils.models import UUIDModel, CreatedUpdatedModel
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
|
@ -7,4 +7,15 @@ class OutgoingIrcMessage(CreatedUpdatedModel):
|
||||||
target = models.CharField(max_length=100)
|
target = models.CharField(max_length=100)
|
||||||
message = models.CharField(max_length=200)
|
message = models.CharField(max_length=200)
|
||||||
processed = models.BooleanField(default=False)
|
processed = models.BooleanField(default=False)
|
||||||
|
timeout = models.DateTimeField()
|
||||||
|
expired = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "PRIVMSG %s %s (%s)" % (self.target, self.message, 'processed' if self.processed else 'unprocessed')
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
if not self.pk:
|
||||||
|
# this is a new outgoing message being saved
|
||||||
|
if self.timeout < timezone.now():
|
||||||
|
raise ValidationError({'timeout': 'The timeout can not be in the past'})
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ django-allauth==0.30.0
|
||||||
django-bleach==0.3.0
|
django-bleach==0.3.0
|
||||||
django-bootstrap3==8.1.0
|
django-bootstrap3==8.1.0
|
||||||
django-debug-toolbar==1.6
|
django-debug-toolbar==1.6
|
||||||
django-environ==0.4.1
|
|
||||||
django-wkhtmltopdf==3.1.0
|
django-wkhtmltopdf==3.1.0
|
||||||
docopt==0.6.2
|
docopt==0.6.2
|
||||||
future==0.16.0
|
future==0.16.0
|
||||||
|
|
Loading…
Reference in a new issue