Port rest of iesg.views and test cases, move redesign announcement models so tests can run

- Legacy-Id: 3129
This commit is contained in:
Ole Laursen 2011-05-17 12:38:44 +00:00
parent c04f107177
commit 1e4b5ee74c
15 changed files with 484 additions and 248 deletions

View file

@ -1,5 +1,6 @@
#coding: utf-8
from django.contrib import admin
from django.conf import settings
from ietf.announcements.models import *
class AnnouncedFromAdmin(admin.ModelAdmin):
@ -21,3 +22,22 @@ class ScheduledAnnouncementAdmin(admin.ModelAdmin):
pass
admin.site.register(ScheduledAnnouncement, ScheduledAnnouncementAdmin)
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
class MessageAdmin(admin.ModelAdmin):
list_display = ["time", "by", "subject", "groups"]
search_fields = ["text"]
raw_id_fields = ["by"]
def groups(self, instance):
return ", ".join(g.acronym for g in related_groups.all())
admin.site.register(Message, MessageAdmin)
class SendQueueAdmin(admin.ModelAdmin):
list_display = ["time", "by", "message", "send_at", "sent_at"]
list_filter = ["time", "send_at", "sent_at"]
search_fields = ["message__text"]
raw_id_fields = ["by"]
admin.site.register(SendQueue, SendQueueAdmin)

View file

@ -1,6 +1,7 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.db import models
from django.conf import settings
from ietf.idtracker.models import PersonOrOrgInfo, ChairsHistory
#from django.contrib.auth.models import Permission
@ -87,3 +88,39 @@ class ScheduledAnnouncement(models.Model):
db_table = 'scheduled_announcements'
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
import datetime
from person.models import Email
from group.models import Group
class Message(models.Model):
time = models.DateTimeField(default=datetime.datetime.now)
by = models.ForeignKey(Email)
subject = models.CharField(max_length=255)
frm = models.CharField(max_length=255)
to = models.CharField(max_length=255)
cc = models.CharField(max_length=255, blank=True)
bcc = models.CharField(max_length=255, blank=True)
reply_to = models.CharField(max_length=255, blank=True)
text = models.TextField()
related_groups = models.ManyToManyField(Group, blank=True)
class Meta:
ordering = ['time']
def __unicode__(self):
return "'%s' %s -> %s" % (self.subject, self.frm, self.to)
class SendQueue(models.Model):
time = models.DateTimeField(default=datetime.datetime.now)
by = models.ForeignKey(Email)
comment = models.TextField()
message = models.ForeignKey(Message)
send_at = models.DateTimeField(blank=True, null=True)
sent_at = models.DateTimeField(blank=True, null=True)
class Meta:
ordering = ['time']

View file

@ -37,7 +37,7 @@ def nomcom(request):
def nomcomREDESIGN(request):
from person.models import Email
from group.models import Group
from redesign.announcements.models import Message
from ietf.announcements.models import Message
address_re = re.compile("<.*>")
@ -77,7 +77,7 @@ if settings.USE_DB_REDESIGN_PROXY_CLASSES:
def message_detail(request, object_id, queryset):
from person.models import Email
from group.models import Group
from redesign.announcements.models import Message
from ietf.announcements.models import Message
# restrict to nomcom announcements for the time being
nomcoms = Group.objects.filter(acronym__startswith="nomcom").exclude(acronym="nomcom")

View file

@ -51,8 +51,8 @@ def get_soon_to_expire_idsREDESIGN(days):
end_date = start_date + datetime.timedelta(days - 1)
for d in expirable_documents():
e = document_expires(d)
if e and start_date <= e.date() <= end_date:
t = document_expires(d)
if t and start_date <= t.date() <= end_date:
yield d
def get_expired_ids():
@ -68,8 +68,8 @@ def get_expired_idsREDESIGN():
today = datetime.date.today()
for d in expirable_documents():
e = document_expires(d)
if e and e.time.date() <= today:
t = document_expires(d)
if t and t.date() <= today:
yield d
def send_expire_warning_for_id(doc):

View file

@ -247,7 +247,6 @@ def insert_into_databaseREDESIGN(drafts, refs):
for name, date_received, state, stream_id in drafts:
try:
d = Document.objects.get(name=name)
print "known document", name
except Document.DoesNotExist:
log("unknown document %s" % name)
continue

View file

@ -41,7 +41,6 @@ from django.conf import settings
from pyquery import PyQuery
#from ietf.idrfc.models import *
from ietf.idtracker.models import IESGLogin, PersonOrOrgInfo, EmailAddress, IDDates
from doc.models import *
from name.models import *
@ -50,183 +49,13 @@ from person.models import *
from ietf.iesg.models import TelechatDates
from ietf.utils.test_utils import SimpleUrlTestCase, RealDatabaseTest, login_testing_unauthorized
from ietf.utils.test_runner import mail_outbox
from ietf.utils.test_data import make_test_data
class IdRfcUrlTestCase(SimpleUrlTestCase):
def testUrls(self):
#self.doTestUrls(__file__)
self.doTestUrls(os.path.join(os.path.dirname(os.path.abspath(__file__)), "testurlREDESIGN.list"))
def make_test_data():
# groups
area = Group.objects.create(
name="Far Future",
acronym="farfut",
state_id="active",
type_id="area",
parent=None)
group = Group.objects.create(
name="Martian Special Interest Group",
acronym="mars",
state_id="active",
type_id="wg",
parent=area,
)
# persons
Email.objects.get_or_create(address="(System)")
# ad
p = Person.objects.create(
name="Aread Irector",
ascii="Aread Irector",
)
ad = Email.objects.create(
address="aread@ietf.org",
person=p)
Role.objects.create(
name_id="ad",
group=area,
email=ad)
porg = PersonOrOrgInfo.objects.create(
first_name="Aread",
last_name="Irector",
middle_initial="",
)
EmailAddress.objects.create(
person_or_org=porg,
priority=1,
address=ad.address,
)
IESGLogin.objects.create(
login_name="ad",
password="foo",
user_level=1,
first_name=porg.first_name,
last_name=porg.last_name,
person=porg,
)
# create a bunch of ads for swarm tests
for i in range(1, 10):
p = Person.objects.create(
name="Ad No%s" % i,
ascii="Ad No%s" % i,
)
email = Email.objects.create(
address="ad%s@ietf.org" % i,
person=p)
Role.objects.create(
name_id="ad" if i <= 5 else "ex-ad",
group=area,
email=email)
porg = PersonOrOrgInfo.objects.create(
first_name="Ad",
last_name="No%s" % i,
middle_initial="",
)
EmailAddress.objects.create(
person_or_org=porg,
priority=1,
address=ad.address,
)
IESGLogin.objects.create(
login_name="ad%s" % i,
password="foo",
user_level=1,
first_name=porg.first_name,
last_name=porg.last_name,
person=porg,
)
# group chair
p = Person.objects.create(
name="WG Chair Man",
ascii="WG Chair Man",
)
wgchair = Email.objects.create(
address="wgchairman@ietf.org",
person=p)
Role.objects.create(
name=RoleName.objects.get(slug="chair"),
group=group,
email=wgchair,
)
# secretary
p = Person.objects.create(
name="Sec Retary",
ascii="Sec Retary",
)
Email.objects.create(
address="sec.retary@ietf.org",
person=p)
porg = PersonOrOrgInfo.objects.create(
first_name="Sec",
last_name="Retary",
middle_initial="",
)
EmailAddress.objects.create(
person_or_org=porg,
priority=1,
address="sec.retary@ietf.org",
)
IESGLogin.objects.create(
login_name="secretary",
password="foo",
user_level=0,
first_name=porg.first_name,
last_name=porg.last_name,
person=porg,
)
# draft
draft = Document.objects.create(
name="draft-ietf-test",
time=datetime.datetime.now(),
type_id="draft",
title="Optimizing Martian Network Topologies",
state_id="active",
iesg_state_id="pub-req",
stream_id="ietf",
group=group,
abstract="Techniques for achieving near-optimal Martian networks.",
rev="01",
pages=2,
intended_std_level_id="ps",
ad=ad,
notify="aliens@example.mars",
note="",
)
DocAlias.objects.create(
document=draft,
name=draft.name,
)
DocumentAuthor.objects.create(
document=draft,
author=Email.objects.get(address="aread@ietf.org"),
order=1
)
# draft has only one event
Event.objects.create(
type="started_iesg_process",
by=ad,
doc=draft,
desc="Added draft",
)
# telechat dates
t = datetime.date.today()
dates = TelechatDates(date1=t,
date2=t + datetime.timedelta(days=7),
date3=t + datetime.timedelta(days=14),
date4=t + datetime.timedelta(days=21),
)
super(dates.__class__, dates).save(force_insert=True) # work-around hard-coded save block
return draft
class ChangeStateTestCase(django.test.TestCase):
fixtures = ['names']
@ -1051,7 +880,6 @@ class ExpireIDsTestCase(django.test.TestCase):
send_expire_warning_for_id(draft)
print mail_outbox[-1]
self.assertEquals(len(mail_outbox), mailbox_before + 1)
self.assertTrue("aread@ietf.org" in str(mail_outbox[-1])) # author
self.assertTrue("wgchairman@ietf.org" in str(mail_outbox[-1]))

View file

@ -61,6 +61,62 @@ class RescheduleOnAgendaTestCase(django.test.TestCase):
self.assertEquals(draft.idinternal.comments().count(), comments_before + 1)
self.assertTrue("Telechat" in draft.idinternal.comments()[0].comment_text)
class RescheduleOnAgendaTestCaseREDESIGN(django.test.TestCase):
fixtures = ['names']
def test_reschedule(self):
from ietf.utils.test_data import make_test_data
from redesign.person.models import Email
from doc.models import TelechatEvent
draft = make_test_data()
# add to schedule
e = TelechatEvent(type="scheduled_for_telechat")
e.doc = draft
e.by = Email.objects.get(address="aread@ietf.org")
e.telechat_date = TelechatDates.objects.all()[0].date1
e.returning_item = True
e.save()
form_id = draft.pk
telechat_date_before = e.telechat_date
url = urlreverse('ietf.iesg.views.agenda_documents')
self.client.login(remote_user="secretary")
# normal get
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
# FIXME
#self.assertEquals(len(q('form select[name=%s-telechat_date]' % form_id)), 1)
#self.assertEquals(len(q('form input[name=%s-clear_returning_item]' % form_id)), 1)
# reschedule
events_before = draft.event_set.count()
d = TelechatDates.objects.all()[0].dates()[2]
r = self.client.post(url, { '%s-telechat_date' % form_id: d.strftime("%Y-%m-%d"),
'%s-clear_returning_item' % form_id: "1" })
self.assertEquals(r.status_code, 200)
# check that it moved below the right header in the DOM on the
# agenda docs page
d_header_pos = r.content.find("IESG telechat %s" % d.strftime("%Y-%m-%d"))
draft_pos = r.content.find(draft.name)
self.assertTrue(d_header_pos < draft_pos)
self.assertTrue(draft.latest_event(TelechatEvent, "scheduled_for_telechat"))
self.assertEquals(draft.latest_event(TelechatEvent, "scheduled_for_telechat").telechat_date, d)
self.assertTrue(not draft.latest_event(TelechatEvent, "scheduled_for_telechat").returning_item)
self.assertEquals(draft.event_set.count(), events_before + 1)
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
RescheduleOnAgendaTestCase = RescheduleOnAgendaTestCaseREDESIGN
class ManageTelechatDatesTestCase(django.test.TestCase):
fixtures = ['base', 'draft']
@ -212,7 +268,152 @@ class WorkingGroupActionsTestCase(django.test.TestCase):
self.assertEquals(r.status_code, 200)
self.assertTrue('(sieve)' not in r.content)
class WorkingGroupActionsTestCaseREDESIGN(django.test.TestCase):
fixtures = ['names']
def setUp(self):
super(self.__class__, self).setUp()
curdir = os.path.dirname(os.path.abspath(__file__))
self.evaldir = os.path.join(curdir, "tmp-testdir")
os.mkdir(self.evaldir)
src = os.path.join(curdir, "fixtures", "sieve-charter.txt")
shutil.copy(src, self.evaldir)
settings.IESG_WG_EVALUATION_DIR = self.evaldir
def tearDown(self):
super(self.__class__, self).tearDown()
shutil.rmtree(self.evaldir)
def test_working_group_actions(self):
from ietf.utils.test_data import make_test_data
make_test_data()
url = urlreverse('iesg_working_group_actions')
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
for wga in WGAction.objects.all():
self.assertTrue(wga.group_acronym.name in r.content)
self.assertTrue('(sieve)' in r.content)
def test_delete_wgaction(self):
from ietf.utils.test_data import make_test_data
make_test_data()
wga = WGAction.objects.all()[0]
url = urlreverse('iesg_edit_working_group_action', kwargs=dict(wga_id=wga.pk))
login_testing_unauthorized(self, "secretary", url)
r = self.client.post(url, dict(delete="1"))
self.assertEquals(r.status_code, 302)
self.assertTrue(not WGAction.objects.filter(pk=wga.pk))
def test_edit_wgaction(self):
from ietf.utils.test_data import make_test_data
from redesign.person.models import Email
make_test_data()
wga = WGAction.objects.all()[0]
url = urlreverse('iesg_edit_working_group_action', kwargs=dict(wga_id=wga.pk))
login_testing_unauthorized(self, "secretary", url)
# normal get
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
self.assertEquals(len(q('form select[name=token_name]')), 1)
self.assertEquals(len(q('form select[name=telechat_date]')), 1)
# change
dates = TelechatDates.objects.all()[0]
token_name = Email.objects.get(address="ad1@ietf.org").get_name().split(" ")[0]
old = wga.pk
r = self.client.post(url, dict(status_date=dates.date1.isoformat(),
token_name=token_name,
category="23",
note="Testing.",
telechat_date=dates.date4.isoformat()))
self.assertEquals(r.status_code, 302)
wga = WGAction.objects.get(pk=old)
self.assertEquals(wga.status_date, dates.date1)
self.assertEquals(wga.token_name, token_name)
self.assertEquals(wga.category, 23)
self.assertEquals(wga.note, "Testing.")
self.assertEquals(wga.telechat_date, dates.date4)
def test_add_possible_wg(self):
from ietf.utils.test_data import make_test_data
from redesign.person.models import Email
from redesign.group.models import Group
make_test_data()
url = urlreverse('iesg_working_group_actions')
login_testing_unauthorized(self, "secretary", url)
r = self.client.post(url, dict(add="1",
filename='sieve-charter.txt'))
self.assertEquals(r.status_code, 302)
# now we got back a URL we can use for adding, but first make
# sure we got a proposed group with the acronym
group = Group.objects.create(
name="Sieve test test",
acronym="sieve",
state_id="proposed",
type_id="wg",
parent=None
)
add_url = r['Location']
r = self.client.get(add_url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue('(sieve)' in r.content)
self.assertEquals(len(q('form select[name=token_name]')), 1)
self.assertEquals(q('form input[name=status_date]')[0].get("value"), "2010-05-07")
self.assertEquals(len(q('form select[name=telechat_date]')), 1)
wgas_before = WGAction.objects.all().count()
dates = TelechatDates.objects.all()[0]
token_name = Email.objects.get(address="ad1@ietf.org").get_name().split(" ")[0]
r = self.client.post(add_url,
dict(status_date=dates.date1.isoformat(),
token_name=token_name,
category="23",
note="Testing.",
telechat_date=dates.date4.isoformat()))
self.assertEquals(r.status_code, 302)
self.assertEquals(wgas_before + 1, WGAction.objects.all().count())
def test_delete_possible_wg(self):
from ietf.utils.test_data import make_test_data
make_test_data()
url = urlreverse('iesg_working_group_actions')
login_testing_unauthorized(self, "secretary", url)
r = self.client.post(url, dict(delete="1",
filename='sieve-charter.txt'))
self.assertEquals(r.status_code, 200)
self.assertTrue('(sieve)' not in r.content)
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
WorkingGroupActionsTestCase = WorkingGroupActionsTestCaseREDESIGN
class IesgUrlTestCase(SimpleUrlTestCase):

View file

@ -380,12 +380,20 @@ def handle_reschedule_form(request, idinternal, dates):
if request.method == 'POST':
form = RescheduleForm(request.POST, **formargs)
if form.is_valid():
update_telechat(request, idinternal,
form.cleaned_data['telechat_date'])
if form.cleaned_data['clear_returning_item']:
idinternal.returning_item = False
idinternal.event_date = datetime.date.today()
idinternal.save()
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
login = request.user.get_profile().email()
update_telechat(request, idinternal, login,
form.cleaned_data['telechat_date'],
False if form.cleaned_data['clear_returning_item'] else None)
idinternal.time = datetime.datetime.now()
idinternal.save()
else:
update_telechat(request, idinternal,
form.cleaned_data['telechat_date'])
if form.cleaned_data['clear_returning_item']:
idinternal.returning_item = False
idinternal.event_date = datetime.date.today()
idinternal.save()
else:
form = RescheduleForm(**formargs)
@ -405,7 +413,6 @@ def agenda_documents(request):
else:
idinternals = list(IDInternal.objects.filter(telechat_date__in=dates,primary_flag=1,agenda=1).order_by('rfc_flag', 'ballot'))
for i in idinternals:
# FIXME: this isn't ported, apparently disabled
i.reschedule_form = handle_reschedule_form(request, i, dates)
# some may have been taken off the schedule by the reschedule form
@ -435,7 +442,14 @@ def agenda_documents(request):
def telechat_docs_tarfile(request,year,month,day):
from tempfile import mkstemp
date=datetime.date(int(year),int(month),int(day))
docs= IDInternal.objects.filter(telechat_date=date, primary_flag=1, agenda=1)
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
from doc.models import TelechatEvent
docs = []
for d in IDInternal.objects.filter(event__telechatevent__telechat_date=date):
if d.latest_event(TelechatEvent, type="scheduled_for_telechat").telechat_date == date:
docs.append(d)
else:
docs= IDInternal.objects.filter(telechat_date=date, primary_flag=1, agenda=1)
response = HttpResponse(mimetype='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=telechat-%s-%s-%s-docs.tgz'%(year, month, day)
tarstream = tarfile.open('','w:gz',response)

View file

@ -125,7 +125,6 @@ INSTALLED_APPS = (
'redesign.name',
'redesign.group',
'redesign.doc',
'redesign.announcements',
'redesign.issue',
'ietf.announcements',
'ietf.idindex',

View file

@ -143,7 +143,6 @@ def send_mail_mime(request, to, frm, subject, msg, cc=None, extra=None, toUser=N
msg['To'] = to
if cc:
msg['Cc'] = cc
print cc
msg['Subject'] = subject
msg['X-Test-IDTracker'] = (settings.SERVER_MODE == 'production') and 'no' or 'yes'
if extra:

196
ietf/utils/test_data.py Normal file
View file

@ -0,0 +1,196 @@
from ietf.idtracker.models import IESGLogin, PersonOrOrgInfo, EmailAddress
from ietf.iesg.models import TelechatDates, WGAction
from redesign.doc.models import *
from redesign.name.models import *
from redesign.group.models import *
from redesign.person.models import *
def make_test_data():
# groups
area = Group.objects.create(
name="Far Future",
acronym="farfut",
state_id="active",
type_id="area",
parent=None)
group = Group.objects.create(
name="Martian Special Interest Group",
acronym="mars",
state_id="active",
type_id="wg",
parent=area,
)
# persons
Email.objects.get_or_create(address="(System)")
# ad
p = Person.objects.create(
name="Aread Irector",
ascii="Aread Irector",
)
ad = Email.objects.create(
address="aread@ietf.org",
person=p)
Role.objects.create(
name_id="ad",
group=area,
email=ad)
porg = PersonOrOrgInfo.objects.create(
first_name="Aread",
last_name="Irector",
middle_initial="",
)
EmailAddress.objects.create(
person_or_org=porg,
priority=1,
address=ad.address,
)
IESGLogin.objects.create(
login_name="ad",
password="foo",
user_level=1,
first_name=porg.first_name,
last_name=porg.last_name,
person=porg,
)
# create a bunch of ads for swarm tests
for i in range(1, 10):
p = Person.objects.create(
name="Ad No%s" % i,
ascii="Ad No%s" % i,
)
email = Email.objects.create(
address="ad%s@ietf.org" % i,
person=p)
Role.objects.create(
name_id="ad" if i <= 5 else "ex-ad",
group=area,
email=email)
porg = PersonOrOrgInfo.objects.create(
first_name="Ad",
last_name="No%s" % i,
middle_initial="",
)
EmailAddress.objects.create(
person_or_org=porg,
priority=1,
address=ad.address,
)
IESGLogin.objects.create(
login_name="ad%s" % i,
password="foo",
user_level=1,
first_name=porg.first_name,
last_name=porg.last_name,
person=porg,
)
# group chair
p = Person.objects.create(
name="WG Chair Man",
ascii="WG Chair Man",
)
wgchair = Email.objects.create(
address="wgchairman@ietf.org",
person=p)
Role.objects.create(
name=RoleName.objects.get(slug="chair"),
group=group,
email=wgchair,
)
# secretary
p = Person.objects.create(
name="Sec Retary",
ascii="Sec Retary",
)
Email.objects.create(
address="sec.retary@ietf.org",
person=p)
porg = PersonOrOrgInfo.objects.create(
first_name="Sec",
last_name="Retary",
middle_initial="",
)
EmailAddress.objects.create(
person_or_org=porg,
priority=1,
address="sec.retary@ietf.org",
)
IESGLogin.objects.create(
login_name="secretary",
password="foo",
user_level=0,
first_name=porg.first_name,
last_name=porg.last_name,
person=porg,
)
# draft
draft = Document.objects.create(
name="draft-ietf-test",
time=datetime.datetime.now(),
type_id="draft",
title="Optimizing Martian Network Topologies",
state_id="active",
iesg_state_id="pub-req",
stream_id="ietf",
group=group,
abstract="Techniques for achieving near-optimal Martian networks.",
rev="01",
pages=2,
intended_std_level_id="ps",
ad=ad,
notify="aliens@example.mars",
note="",
)
DocAlias.objects.create(
document=draft,
name=draft.name,
)
DocumentAuthor.objects.create(
document=draft,
author=Email.objects.get(address="aread@ietf.org"),
order=1
)
# draft has only one event
Event.objects.create(
type="started_iesg_process",
by=ad,
doc=draft,
desc="Added draft",
)
# telechat dates
t = datetime.date.today()
dates = TelechatDates(date1=t,
date2=t + datetime.timedelta(days=7),
date3=t + datetime.timedelta(days=14),
date4=t + datetime.timedelta(days=21),
)
super(dates.__class__, dates).save(force_insert=True) # work-around hard-coded save block
# WG Actions
group = Group.objects.create(
name="Asteroid Mining Equipment Standardization Group",
acronym="ames",
state_id="proposed",
type_id="wg",
parent=area,
)
WGAction.objects.create(
pk=group.pk,
note="",
status_date=datetime.date.today(),
agenda=1,
token_name="Aread",
category=13,
telechat_date=dates.date2
)
return draft

View file

@ -1,20 +0,0 @@
from django.contrib import admin
from models import *
class MessageAdmin(admin.ModelAdmin):
list_display = ["time", "by", "subject", "groups"]
search_fields = ["text"]
raw_id_fields = ["by"]
def groups(self, instance):
return ", ".join(g.acronym for g in related_groups.all())
admin.site.register(Message, MessageAdmin)
class SendQueueAdmin(admin.ModelAdmin):
list_display = ["time", "by", "message", "send_at", "sent_at"]
list_filter = ["time", "send_at", "sent_at"]
search_fields = ["message__text"]
raw_id_fields = ["by"]
admin.site.register(SendQueue, SendQueueAdmin)

View file

@ -1,37 +0,0 @@
from django.db import models
import datetime
from person.models import Email
from group.models import Group
class Message(models.Model):
time = models.DateTimeField(default=datetime.datetime.now)
by = models.ForeignKey(Email)
subject = models.CharField(max_length=255)
frm = models.CharField(max_length=255)
to = models.CharField(max_length=255)
cc = models.CharField(max_length=255, blank=True)
bcc = models.CharField(max_length=255, blank=True)
reply_to = models.CharField(max_length=255, blank=True)
text = models.TextField()
related_groups = models.ManyToManyField(Group, blank=True)
class Meta:
ordering = ['time']
def __unicode__(self):
return "'%s' %s -> %s" % (self.subject, self.frm, self.to)
class SendQueue(models.Model):
time = models.DateTimeField(default=datetime.datetime.now)
by = models.ForeignKey(Email)
comment = models.TextField()
message = models.ForeignKey(Message)
send_at = models.DateTimeField(blank=True, null=True)
sent_at = models.DateTimeField(blank=True, null=True)
class Meta:
ordering = ['time']

View file

@ -13,9 +13,9 @@ management.setup_environ(settings)
from redesign.person.models import *
from redesign.group.models import *
from redesign.announcements.models import *
from redesign.name.utils import name
from redesign.importing.utils import person_email
from ietf.announcements.models import Message
from ietf.announcements.models import Announcement, PersonOrOrgInfo, AnnouncedTo, AnnouncedFrom
# assumptions: