Changed all usage of ForeignKey and OneToOneFiled in model.py files to the compatibility versions from ietf.utils.models.

- Legacy-Id: 14661
This commit is contained in:
Henrik Levkowetz 2018-02-20 15:36:05 +00:00
parent c760792339
commit 5638cf3da3
26 changed files with 253 additions and 227 deletions

View file

@ -6,10 +6,11 @@ from django.urls import reverse as urlreverse
from ietf.doc.models import Document, DocEvent, State
from ietf.group.models import Group
from ietf.person.models import Person, Email
from ietf.utils.models import ForeignKey, OneToOneField
class CommunityList(models.Model):
user = models.ForeignKey(User, blank=True, null=True)
group = models.ForeignKey(Group, blank=True, null=True)
user = ForeignKey(User, blank=True, null=True)
group = ForeignKey(Group, blank=True, null=True)
added_docs = models.ManyToManyField(Document)
def long_name(self):
@ -59,13 +60,13 @@ class SearchRule(models.Model):
('name_contains', 'All I-Ds with particular text/regular expression in the name'),
]
community_list = models.ForeignKey(CommunityList)
community_list = ForeignKey(CommunityList)
rule_type = models.CharField(max_length=30, choices=RULE_TYPES)
# these are filled in depending on the type
state = models.ForeignKey(State, blank=True, null=True)
group = models.ForeignKey(Group, blank=True, null=True)
person = models.ForeignKey(Person, blank=True, null=True)
state = ForeignKey(State, blank=True, null=True)
group = ForeignKey(Group, blank=True, null=True)
person = ForeignKey(Person, blank=True, null=True)
text = models.CharField(verbose_name="Text/RegExp", max_length=255, blank=True, default="")
# store a materialized view/index over which documents are matched
@ -78,8 +79,8 @@ class SearchRule(models.Model):
return "%s %s %s/%s/%s/%s" % (self.community_list, self.rule_type, self.state, self.group, self.person, self.text)
class EmailSubscription(models.Model):
community_list = models.ForeignKey(CommunityList)
email = models.ForeignKey(Email)
community_list = ForeignKey(CommunityList)
email = ForeignKey(Email)
NOTIFICATION_CHOICES = [
("all", "All changes"),

View file

@ -2,6 +2,7 @@ from django.db import models
from ietf.group.models import Group
from ietf.name.models import DBTemplateTypeName
from ietf.utils.models import ForeignKey, OneToOneField
TEMPLATE_TYPES = (
@ -15,9 +16,9 @@ class DBTemplate(models.Model):
path = models.CharField( max_length=255, unique=True, blank=False, null=False, )
title = models.CharField( max_length=255, blank=False, null=False, )
variables = models.TextField( blank=True, null=True, )
type = models.ForeignKey( DBTemplateTypeName, )
type = ForeignKey( DBTemplateTypeName, )
content = models.TextField( blank=False, null=False, )
group = models.ForeignKey( Group, blank=True, null=True, )
group = ForeignKey( Group, blank=True, null=True, )
def __unicode__(self):
return self.title

View file

@ -27,6 +27,7 @@ from ietf.utils import log
from ietf.utils.admin import admin_link
from ietf.utils.validators import validate_no_control_chars
from ietf.utils.mail import formataddr
from ietf.utils.models import ForeignKey, OneToOneField
logger = logging.getLogger('django')
@ -52,7 +53,7 @@ def check_statetype_slugs(app_configs, **kwargs):
return errors
class State(models.Model):
type = models.ForeignKey(StateType)
type = ForeignKey(StateType)
slug = models.SlugField()
name = models.CharField(max_length=255)
used = models.BooleanField(default=True)
@ -74,13 +75,13 @@ class DocumentInfo(models.Model):
"""Any kind of document. Draft, RFC, Charter, IPR Statement, Liaison Statement"""
time = models.DateTimeField(default=datetime.datetime.now) # should probably have auto_now=True
type = models.ForeignKey(DocTypeName, blank=True, null=True) # Draft, Agenda, Minutes, Charter, Discuss, Guideline, Email, Review, Issue, Wiki, External ...
type = ForeignKey(DocTypeName, blank=True, null=True) # Draft, Agenda, Minutes, Charter, Discuss, Guideline, Email, Review, Issue, Wiki, External ...
title = models.CharField(max_length=255, validators=[validate_no_control_chars, ])
states = models.ManyToManyField(State, blank=True) # plain state (Active/Expired/...), IESG state, stream state
tags = models.ManyToManyField(DocTagName, blank=True) # Revised ID Needed, ExternalParty, AD Followup, ...
stream = models.ForeignKey(StreamName, blank=True, null=True) # IETF, IAB, IRTF, Independent Submission
group = models.ForeignKey(Group, blank=True, null=True) # WG, RG, IAB, IESG, Edu, Tools
stream = ForeignKey(StreamName, blank=True, null=True) # IETF, IAB, IRTF, Independent Submission
group = ForeignKey(Group, blank=True, null=True) # WG, RG, IAB, IESG, Edu, Tools
abstract = models.TextField(blank=True)
rev = models.CharField(verbose_name="revision", max_length=16, blank=True)
@ -88,10 +89,10 @@ class DocumentInfo(models.Model):
words = models.IntegerField(blank=True, null=True)
formal_languages = models.ManyToManyField(FormalLanguageName, blank=True, help_text="Formal languages used in document")
order = models.IntegerField(default=1, blank=True) # This is probably obviated by SessionPresentaion.order
intended_std_level = models.ForeignKey(IntendedStdLevelName, verbose_name="Intended standardization level", blank=True, null=True)
std_level = models.ForeignKey(StdLevelName, verbose_name="Standardization level", blank=True, null=True)
ad = models.ForeignKey(Person, verbose_name="area director", related_name='ad_%(class)s_set', blank=True, null=True)
shepherd = models.ForeignKey(Email, related_name='shepherd_%(class)s_set', blank=True, null=True)
intended_std_level = ForeignKey(IntendedStdLevelName, verbose_name="Intended standardization level", blank=True, null=True)
std_level = ForeignKey(StdLevelName, verbose_name="Standardization level", blank=True, null=True)
ad = ForeignKey(Person, verbose_name="area director", related_name='ad_%(class)s_set', blank=True, null=True)
shepherd = ForeignKey(Email, related_name='shepherd_%(class)s_set', blank=True, null=True)
expires = models.DateTimeField(blank=True, null=True)
notify = models.CharField(max_length=255, blank=True)
external_url = models.URLField(blank=True) # Should be set for documents with type 'External'.
@ -482,9 +483,9 @@ class DocumentInfo(models.Model):
STATUSCHANGE_RELATIONS = ('tops','tois','tohist','toinf','tobcp','toexp')
class RelatedDocument(models.Model):
source = models.ForeignKey('Document')
target = models.ForeignKey('DocAlias')
relationship = models.ForeignKey(DocRelationshipName)
source = ForeignKey('Document')
target = ForeignKey('DocAlias')
relationship = ForeignKey(DocRelationshipName)
def action(self):
return self.relationship.name
def __unicode__(self):
@ -536,9 +537,9 @@ class RelatedDocument(models.Model):
return False
class DocumentAuthorInfo(models.Model):
person = models.ForeignKey(Person)
person = ForeignKey(Person)
# email should only be null for some historic documents
email = models.ForeignKey(Email, help_text="Email address used by author for submission", blank=True, null=True)
email = ForeignKey(Email, help_text="Email address used by author for submission", blank=True, null=True)
affiliation = models.CharField(max_length=100, blank=True, help_text="Organization/company used by author for submission")
country = models.CharField(max_length=255, blank=True, help_text="Country used by author for submission")
order = models.IntegerField(default=1)
@ -555,7 +556,7 @@ class DocumentAuthorInfo(models.Model):
ordering = ["document", "order"]
class DocumentAuthor(DocumentAuthorInfo):
document = models.ForeignKey('Document')
document = ForeignKey('Document')
def __unicode__(self):
return u"%s %s (%s)" % (self.document.name, self.person, self.order)
@ -807,28 +808,28 @@ class Document(DocumentInfo):
class DocumentURL(models.Model):
doc = models.ForeignKey(Document)
tag = models.ForeignKey(DocUrlTagName)
doc = ForeignKey(Document)
tag = ForeignKey(DocUrlTagName)
desc = models.CharField(max_length=255, default='', blank=True)
url = models.URLField(max_length=512)
class RelatedDocHistory(models.Model):
source = models.ForeignKey('DocHistory')
target = models.ForeignKey('DocAlias', related_name="reversely_related_document_history_set")
relationship = models.ForeignKey(DocRelationshipName)
source = ForeignKey('DocHistory')
target = ForeignKey('DocAlias', related_name="reversely_related_document_history_set")
relationship = ForeignKey(DocRelationshipName)
def __unicode__(self):
return u"%s %s %s" % (self.source.doc.name, self.relationship.name.lower(), self.target.name)
class DocHistoryAuthor(DocumentAuthorInfo):
# use same naming convention as non-history version to make it a bit
# easier to write generic code
document = models.ForeignKey('DocHistory', related_name="documentauthor_set")
document = ForeignKey('DocHistory', related_name="documentauthor_set")
def __unicode__(self):
return u"%s %s (%s)" % (self.document.doc.name, self.person, self.order)
class DocHistory(DocumentInfo):
doc = models.ForeignKey(Document, related_name="history_set")
doc = ForeignKey(Document, related_name="history_set")
# the name here is used to capture the canonical name at the time
# - it would perhaps be more elegant to simply call the attribute
# canonical_name and replace the function on Document with a
@ -878,7 +879,7 @@ class DocAlias(models.Model):
to by RFC number, primarily, after achieving RFC status.
"""
name = models.CharField(max_length=255, primary_key=True)
document = models.ForeignKey(Document)
document = ForeignKey(Document)
def __unicode__(self):
return "%s-->%s" % (self.name, self.document.name)
document_link = admin_link("document")
@ -887,8 +888,8 @@ class DocAlias(models.Model):
verbose_name_plural = "document aliases"
class DocReminder(models.Model):
event = models.ForeignKey('DocEvent')
type = models.ForeignKey(DocReminderTypeName)
event = ForeignKey('DocEvent')
type = ForeignKey(DocReminderTypeName)
due = models.DateTimeField()
active = models.BooleanField(default=True)
@ -972,8 +973,8 @@ class DocEvent(models.Model):
"""An occurrence for a document, used for tracking who, when and what."""
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened", db_index=True)
type = models.CharField(max_length=50, choices=EVENT_TYPES)
by = models.ForeignKey(Person)
doc = models.ForeignKey('doc.Document')
by = ForeignKey(Person)
doc = ForeignKey('doc.Document')
rev = models.CharField(verbose_name="revision", max_length=16, null=True, blank=True)
desc = models.TextField()
@ -998,15 +999,15 @@ class NewRevisionDocEvent(DocEvent):
pass
class StateDocEvent(DocEvent):
state_type = models.ForeignKey(StateType)
state = models.ForeignKey(State, blank=True, null=True)
state_type = ForeignKey(StateType)
state = ForeignKey(State, blank=True, null=True)
class ConsensusDocEvent(DocEvent):
consensus = models.NullBooleanField(default=None)
# IESG events
class BallotType(models.Model):
doc_type = models.ForeignKey(DocTypeName, blank=True, null=True)
doc_type = ForeignKey(DocTypeName, blank=True, null=True)
slug = models.SlugField()
name = models.CharField(max_length=255)
question = models.TextField(blank=True)
@ -1021,7 +1022,7 @@ class BallotType(models.Model):
ordering = ['order']
class BallotDocEvent(DocEvent):
ballot_type = models.ForeignKey(BallotType)
ballot_type = ForeignKey(BallotType)
def active_ad_positions(self):
"""Return dict mapping each active AD to a current ballot position (or None if they haven't voted)."""
@ -1083,9 +1084,9 @@ class BallotDocEvent(DocEvent):
return positions
class BallotPositionDocEvent(DocEvent):
ballot = models.ForeignKey(BallotDocEvent, null=True, default=None) # default=None is a temporary migration period fix, should be removed when charter branch is live
ad = models.ForeignKey(Person)
pos = models.ForeignKey(BallotPositionName, verbose_name="position", default="norecord")
ballot = ForeignKey(BallotDocEvent, null=True, default=None) # default=None is a temporary migration period fix, should be removed when charter branch is live
ad = ForeignKey(Person)
pos = ForeignKey(BallotPositionName, verbose_name="position", default="norecord")
discuss = models.TextField(help_text="Discuss text if position is discuss", blank=True)
discuss_time = models.DateTimeField(help_text="Time discuss text was written", blank=True, null=True)
comment = models.TextField(help_text="Optional comment", blank=True)
@ -1102,8 +1103,8 @@ class TelechatDocEvent(DocEvent):
returning_item = models.BooleanField(default=False)
class ReviewRequestDocEvent(DocEvent):
review_request = models.ForeignKey('review.ReviewRequest')
state = models.ForeignKey(ReviewRequestStateName, blank=True, null=True)
review_request = ForeignKey('review.ReviewRequest')
state = ForeignKey(ReviewRequestStateName, blank=True, null=True)
# charter events
class InitialReviewDocEvent(DocEvent):
@ -1111,20 +1112,20 @@ class InitialReviewDocEvent(DocEvent):
class AddedMessageEvent(DocEvent):
import ietf.message.models
message = models.ForeignKey(ietf.message.models.Message, null=True, blank=True,related_name='doc_manualevents')
message = ForeignKey(ietf.message.models.Message, null=True, blank=True,related_name='doc_manualevents')
msgtype = models.CharField(max_length=25)
in_reply_to = models.ForeignKey(ietf.message.models.Message, null=True, blank=True,related_name='doc_irtomanual')
in_reply_to = ForeignKey(ietf.message.models.Message, null=True, blank=True,related_name='doc_irtomanual')
class SubmissionDocEvent(DocEvent):
import ietf.submit.models
submission = models.ForeignKey(ietf.submit.models.Submission)
submission = ForeignKey(ietf.submit.models.Submission)
# dumping store for removed events
class DeletedEvent(models.Model):
content_type = models.ForeignKey(ContentType)
content_type = ForeignKey(ContentType)
json = models.TextField(help_text="Deleted object in JSON format, with attribute names chosen to be suitable for passing into the relevant create method.")
by = models.ForeignKey(Person)
by = ForeignKey(Person)
time = models.DateTimeField(default=datetime.datetime.now)
def __unicode__(self):

View file

@ -2,7 +2,7 @@
from __future__ import unicode_literals
from django.core.urlresolvers import reverse as urlreverse
from django.urls import reverse as urlreverse
from django.http import HttpResponseRedirect
from django.shortcuts import render

View file

@ -15,14 +15,15 @@ from ietf.name.models import GroupStateName, GroupTypeName, DocTagName, GroupMil
from ietf.person.models import Email, Person
from ietf.utils.mail import formataddr
from ietf.utils import log
from ietf.utils.models import ForeignKey, OneToOneField
class GroupInfo(models.Model):
time = models.DateTimeField(default=datetime.datetime.now)
name = models.CharField(max_length=80)
state = models.ForeignKey(GroupStateName, null=True)
type = models.ForeignKey(GroupTypeName, null=True)
parent = models.ForeignKey('Group', blank=True, null=True)
state = ForeignKey(GroupStateName, null=True)
type = ForeignKey(GroupTypeName, null=True)
parent = ForeignKey('Group', blank=True, null=True)
description = models.TextField(blank=True)
list_email = models.CharField(max_length=64, blank=True)
list_subscribe = models.CharField(max_length=255, blank=True)
@ -76,7 +77,7 @@ class Group(GroupInfo):
objects = GroupManager()
acronym = models.SlugField(max_length=40, unique=True, db_index=True)
charter = models.OneToOneField('doc.Document', related_name='chartered_group', blank=True, null=True)
charter = OneToOneField('doc.Document', related_name='chartered_group', blank=True, null=True)
def latest_event(self, *args, **filter_args):
"""Get latest event of optional Python type and with filter
@ -193,14 +194,14 @@ class Group(GroupInfo):
return desc
class GroupHistory(GroupInfo):
group = models.ForeignKey(Group, related_name='history_set')
group = ForeignKey(Group, related_name='history_set')
acronym = models.CharField(max_length=40)
class Meta:
verbose_name_plural="group histories"
class GroupURL(models.Model):
group = models.ForeignKey(Group)
group = ForeignKey(Group)
name = models.CharField(max_length=255)
url = models.URLField()
@ -208,12 +209,12 @@ class GroupURL(models.Model):
return u"%s (%s)" % (self.url, self.name)
class GroupMilestoneInfo(models.Model):
group = models.ForeignKey(Group)
group = ForeignKey(Group)
# a group has two sets of milestones, current milestones
# (active/under review/deleted) and charter milestones (active
# during a charter/recharter event), events for charter milestones
# are stored on the charter document
state = models.ForeignKey(GroupMilestoneStateName)
state = ForeignKey(GroupMilestoneStateName)
desc = models.CharField(verbose_name="Description", max_length=500)
due = models.DateField()
resolved = models.CharField(max_length=50, blank=True, help_text="Explanation of why milestone is resolved (usually \"Done\"), or empty if still due.")
@ -231,13 +232,13 @@ class GroupMilestone(GroupMilestoneInfo):
class GroupMilestoneHistory(GroupMilestoneInfo):
time = models.DateTimeField()
milestone = models.ForeignKey(GroupMilestone, related_name="history_set")
milestone = ForeignKey(GroupMilestone, related_name="history_set")
class GroupStateTransitions(models.Model):
"""Captures that a group has overriden the default available
document state transitions for a certain state."""
group = models.ForeignKey(Group)
state = models.ForeignKey('doc.State', help_text="State for which the next states should be overridden")
group = ForeignKey(Group)
state = ForeignKey('doc.State', help_text="State for which the next states should be overridden")
next_states = models.ManyToManyField('doc.State', related_name='previous_groupstatetransitions_states')
def __unicode__(self):
@ -255,10 +256,10 @@ GROUP_EVENT_CHOICES = [
class GroupEvent(models.Model):
"""An occurrence for a group, used for tracking who, when and what."""
group = models.ForeignKey(Group)
group = ForeignKey(Group)
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened")
type = models.CharField(max_length=50, choices=GROUP_EVENT_CHOICES)
by = models.ForeignKey(Person)
by = ForeignKey(Person)
desc = models.TextField()
def __unicode__(self):
@ -268,16 +269,16 @@ class GroupEvent(models.Model):
ordering = ['-time', 'id']
class ChangeStateGroupEvent(GroupEvent):
state = models.ForeignKey(GroupStateName)
state = ForeignKey(GroupStateName)
class MilestoneGroupEvent(GroupEvent):
milestone = models.ForeignKey(GroupMilestone)
milestone = ForeignKey(GroupMilestone)
class Role(models.Model):
name = models.ForeignKey(RoleName)
group = models.ForeignKey(Group)
person = models.ForeignKey(Person)
email = models.ForeignKey(Email, help_text="Email address used by person for this role.")
name = ForeignKey(RoleName)
group = ForeignKey(Group)
person = ForeignKey(Person)
email = ForeignKey(Email, help_text="Email address used by person for this role.")
def __unicode__(self):
return u"%s is %s in %s" % (self.person.plain_name(), self.name.name, self.group.acronym or self.group.name)
@ -295,10 +296,10 @@ class RoleHistory(models.Model):
# used on its own - there should always be a GroupHistory
# accompanying a change in roles, so lookup the appropriate
# GroupHistory instead
name = models.ForeignKey(RoleName)
group = models.ForeignKey(GroupHistory)
person = models.ForeignKey(Person)
email = models.ForeignKey(Email, help_text="Email address used by person for this role.")
name = ForeignKey(RoleName)
group = ForeignKey(GroupHistory)
person = ForeignKey(Person)
email = ForeignKey(Email, help_text="Email address used by person for this role.")
def __unicode__(self):
return u"%s is %s in %s" % (self.person.plain_name(), self.name.name, self.group.acronym)

View file

@ -36,6 +36,8 @@ import datetime
from django.db import models
from ietf.utils.models import ForeignKey, OneToOneField
class TelechatAgendaItem(models.Model):
TYPE_CHOICES = (
(1, "Any Other Business (WG News, New Proposals, etc.)"),

View file

@ -10,16 +10,17 @@ from ietf.doc.models import DocAlias
from ietf.name.models import DocRelationshipName,IprDisclosureStateName,IprLicenseTypeName,IprEventTypeName
from ietf.person.models import Person
from ietf.message.models import Message
from ietf.utils.models import ForeignKey, OneToOneField
class IprDisclosureBase(models.Model):
by = models.ForeignKey(Person) # who was logged in, or System if nobody was logged in
by = ForeignKey(Person) # who was logged in, or System if nobody was logged in
compliant = models.BooleanField("Complies to RFC3979", default=True)
docs = models.ManyToManyField(DocAlias, through='IprDocRel')
holder_legal_name = models.CharField(max_length=255)
notes = models.TextField("Additional notes", blank=True)
other_designations = models.CharField("Designations for other contributions", blank=True, max_length=255)
rel = models.ManyToManyField('self', through='RelatedIpr', symmetrical=False)
state = models.ForeignKey(IprDisclosureStateName)
state = ForeignKey(IprDisclosureStateName)
submitter_name = models.CharField(max_length=255,blank=True)
submitter_email = models.EmailField(blank=True)
time = models.DateTimeField(auto_now_add=True)
@ -118,7 +119,7 @@ class HolderIprDisclosure(IprDisclosureBase):
holder_contact_email = models.EmailField()
holder_contact_name = models.CharField(max_length=255)
holder_contact_info = models.TextField(blank=True, help_text="Address, phone, etc.")
licensing = models.ForeignKey(IprLicenseTypeName)
licensing = ForeignKey(IprLicenseTypeName)
licensing_comments = models.TextField(blank=True)
submitter_claims_all_terms_disclosed = models.BooleanField(default=False)
@ -145,8 +146,8 @@ class GenericIprDisclosure(IprDisclosureBase):
statement = models.TextField() # includes licensing info
class IprDocRel(models.Model):
disclosure = models.ForeignKey(IprDisclosureBase)
document = models.ForeignKey(DocAlias)
disclosure = ForeignKey(IprDisclosureBase)
document = ForeignKey(DocAlias)
sections = models.TextField(blank=True)
revisions = models.CharField(max_length=16,blank=True) # allows strings like 01-07
@ -175,21 +176,21 @@ class IprDocRel(models.Model):
return u"%s which applies to %s" % (self.disclosure, self.document.name)
class RelatedIpr(models.Model):
source = models.ForeignKey(IprDisclosureBase,related_name='relatedipr_source_set')
target = models.ForeignKey(IprDisclosureBase,related_name='relatedipr_target_set')
relationship = models.ForeignKey(DocRelationshipName) # Re-use; change to a dedicated RelName if needed
source = ForeignKey(IprDisclosureBase,related_name='relatedipr_source_set')
target = ForeignKey(IprDisclosureBase,related_name='relatedipr_target_set')
relationship = ForeignKey(DocRelationshipName) # Re-use; change to a dedicated RelName if needed
def __unicode__(self):
return u"%s %s %s" % (self.source.title, self.relationship.name.lower(), self.target.title)
class IprEvent(models.Model):
time = models.DateTimeField(auto_now_add=True)
type = models.ForeignKey(IprEventTypeName)
by = models.ForeignKey(Person)
disclosure = models.ForeignKey(IprDisclosureBase)
type = ForeignKey(IprEventTypeName)
by = ForeignKey(Person)
disclosure = ForeignKey(IprDisclosureBase)
desc = models.TextField()
message = models.ForeignKey(Message, null=True, blank=True,related_name='msgevents')
in_reply_to = models.ForeignKey(Message, null=True, blank=True,related_name='irtoevents')
message = ForeignKey(Message, null=True, blank=True,related_name='msgevents')
in_reply_to = ForeignKey(Message, null=True, blank=True,related_name='irtoevents')
response_due= models.DateTimeField(blank=True,null=True)
def __unicode__(self):

View file

@ -10,7 +10,7 @@ from django.core.exceptions import ObjectDoesNotExist
from django.db.models.query import QuerySet
from django.forms.utils import ErrorList
from django.db.models import Q
from django.forms.widgets import RadioFieldRenderer
#from django.forms.widgets import RadioFieldRenderer
from django.core.validators import validate_email, ValidationError
from django.utils.html import format_html
from django.utils.encoding import force_text
@ -122,18 +122,18 @@ class AddCommentForm(forms.Form):
comment = forms.CharField(required=True, widget=forms.Textarea, strip=False)
private = forms.BooleanField(label="Private comment", required=False,help_text="If this box is checked the comment will not appear in the statement's public history view.")
class RadioRenderer(RadioFieldRenderer):
def render(self):
output = []
for widget in self:
output.append(format_html(force_text(widget)))
return mark_safe('\n'.join(output))
# class RadioRenderer(RadioFieldRenderer):
# def render(self):
# output = []
# for widget in self:
# output.append(format_html(force_text(widget)))
# return mark_safe('\n'.join(output))
class SearchLiaisonForm(forms.Form):
'''Expects initial keyword argument queryset which then gets filtered based on form data'''
text = forms.CharField(required=False)
scope = forms.ChoiceField(choices=(("all", "All text fields"), ("title", "Title field")), required=False, initial='title', widget=forms.RadioSelect(renderer=RadioRenderer))
# scope = forms.ChoiceField(choices=(("all", "All text fields"), ("title", "Title field")), required=False, initial='title')
source = forms.CharField(required=False)
destination = forms.CharField(required=False)
start_date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label='Start date', required=False)

View file

@ -11,6 +11,7 @@ from ietf.name.models import (LiaisonStatementPurposeName, LiaisonStatementState
DocRelationshipName)
from ietf.doc.models import Document
from ietf.group.models import Group
from ietf.utils.models import ForeignKey, OneToOneField
# maps (previous state id, new state id) to event type id
STATE_EVENT_MAPPING = {
@ -26,7 +27,7 @@ STATE_EVENT_MAPPING = {
class LiaisonStatement(models.Model):
title = models.CharField(max_length=255)
from_groups = models.ManyToManyField(Group, blank=True, related_name='liaisonstatement_from_set')
from_contact = models.ForeignKey(Email, blank=True, null=True)
from_contact = ForeignKey(Email, blank=True, null=True)
to_groups = models.ManyToManyField(Group, blank=True, related_name='liaisonstatement_to_set')
to_contacts = models.CharField(max_length=2000, help_text="Contacts at recipient group")
@ -35,14 +36,14 @@ class LiaisonStatement(models.Model):
action_holder_contacts = models.CharField(blank=True, max_length=255, help_text="Who makes sure action is completed") # incoming only?
cc_contacts = models.TextField(blank=True)
purpose = models.ForeignKey(LiaisonStatementPurposeName)
purpose = ForeignKey(LiaisonStatementPurposeName)
deadline = models.DateField(null=True, blank=True)
other_identifiers = models.TextField(blank=True, null=True) # Identifiers from other bodies
body = models.TextField(blank=True)
tags = models.ManyToManyField(LiaisonStatementTagName, blank=True)
attachments = models.ManyToManyField(Document, through='LiaisonStatementAttachment', blank=True)
state = models.ForeignKey(LiaisonStatementState, default='pending')
state = ForeignKey(LiaisonStatementState, default='pending')
def __unicode__(self):
return self.title or u"<no title>"
@ -194,8 +195,8 @@ class LiaisonStatement(models.Model):
return list(set([ r.email.address for r in approval_set ]))
class LiaisonStatementAttachment(models.Model):
statement = models.ForeignKey(LiaisonStatement)
document = models.ForeignKey(Document)
statement = ForeignKey(LiaisonStatement)
document = ForeignKey(Document)
removed = models.BooleanField(default=False)
def __unicode__(self):
@ -203,16 +204,16 @@ class LiaisonStatementAttachment(models.Model):
class RelatedLiaisonStatement(models.Model):
source = models.ForeignKey(LiaisonStatement, related_name='source_of_set')
target = models.ForeignKey(LiaisonStatement, related_name='target_of_set')
relationship = models.ForeignKey(DocRelationshipName)
source = ForeignKey(LiaisonStatement, related_name='source_of_set')
target = ForeignKey(LiaisonStatement, related_name='target_of_set')
relationship = ForeignKey(DocRelationshipName)
def __unicode__(self):
return u"%s %s %s" % (self.source.title, self.relationship.name.lower(), self.target.title)
class LiaisonStatementGroupContacts(models.Model):
group = models.ForeignKey(Group, unique=True, null=True)
group = ForeignKey(Group, unique=True, null=True)
contacts = models.CharField(max_length=255,blank=True)
cc_contacts = models.CharField(max_length=255,blank=True)
@ -222,9 +223,9 @@ class LiaisonStatementGroupContacts(models.Model):
class LiaisonStatementEvent(models.Model):
time = models.DateTimeField(auto_now_add=True)
type = models.ForeignKey(LiaisonStatementEventTypeName)
by = models.ForeignKey(Person)
statement = models.ForeignKey(LiaisonStatement)
type = ForeignKey(LiaisonStatementEventTypeName)
by = ForeignKey(Person)
statement = ForeignKey(LiaisonStatement)
desc = models.TextField()
def __unicode__(self):

View file

@ -6,6 +6,7 @@ from django.core.validators import validate_email
from django.db import models
from ietf.person.models import Person
from ietf.utils.models import ForeignKey, OneToOneField
class List(models.Model):
name = models.CharField(max_length=32)
@ -28,7 +29,7 @@ class Subscribed(models.Model):
class Whitelisted(models.Model):
time = models.DateTimeField(auto_now_add=True)
email = models.CharField("Email address", max_length=64, validators=[validate_email])
by = models.ForeignKey(Person)
by = ForeignKey(Person)
def __unicode__(self):
return "<Whitelisted: %s at %s>" % (self.email, self.time)
class Meta:

View file

@ -10,6 +10,7 @@ from ietf.person.models import Email
import debug # pyflakes:ignore
from ietf.group.models import Role
from ietf.utils.models import ForeignKey, OneToOneField
def clean_duplicates(addrlist):
address_info = {}

View file

@ -27,6 +27,7 @@ from ietf.person.models import Person
from ietf.utils.storage import NoLocationMigrationFileSystemStorage
from ietf.utils.text import xslugify
from ietf.utils.timezone import date2datetime
from ietf.utils.models import ForeignKey, OneToOneField
countries = pytz.country_names.items()
countries.sort(lambda x,y: cmp(x[1], y[1]))
@ -49,7 +50,7 @@ class Meeting(models.Model):
# number is either the number for IETF meetings, or some other
# identifier for interim meetings/IESG retreats/liaison summits/...
number = models.CharField(unique=True, max_length=64)
type = models.ForeignKey(MeetingTypeName)
type = ForeignKey(MeetingTypeName)
# Date is useful when generating a set of timeslot for this meeting, but
# is not used to determine date for timeslot instances thereafter, as
# they have their own datetime field.
@ -88,11 +89,11 @@ class Meeting(models.Model):
break_area = models.CharField(blank=True, max_length=255)
reg_area = models.CharField(blank=True, max_length=255)
agenda_note = models.TextField(blank=True, help_text="Text in this field will be placed at the top of the html agenda page for the meeting. HTML can be used, but will not be validated.")
agenda = models.ForeignKey('Schedule',null=True,blank=True, related_name='+')
agenda = ForeignKey('Schedule',null=True,blank=True, related_name='+')
session_request_lock_message = models.CharField(blank=True,max_length=255) # locked if not empty
proceedings_final = models.BooleanField(default=False, help_text=u"Are the proceedings for this meeting complete?")
acknowledgements = models.TextField(blank=True, help_text="Acknowledgements for use in meeting proceedings. Use ReStructuredText markup.")
overview = models.ForeignKey(DBTemplate, related_name='overview', null=True, editable=False)
overview = ForeignKey(DBTemplate, related_name='overview', null=True, editable=False)
show_important_dates = models.BooleanField(default=False)
def __unicode__(self):
@ -284,7 +285,7 @@ class Meeting(models.Model):
# === Rooms, Resources, Floorplans =============================================
class ResourceAssociation(models.Model):
name = models.ForeignKey(RoomResourceName)
name = ForeignKey(RoomResourceName)
icon = models.CharField(max_length=64) # icon to be found in /static/img
desc = models.CharField(max_length=256)
@ -300,7 +301,7 @@ class ResourceAssociation(models.Model):
return res1
class Room(models.Model):
meeting = models.ForeignKey(Meeting)
meeting = ForeignKey(Meeting)
time = models.DateTimeField(default=datetime.datetime.now)
name = models.CharField(max_length=255)
functional_name = models.CharField(max_length=255, blank = True)
@ -308,7 +309,7 @@ class Room(models.Model):
resources = models.ManyToManyField(ResourceAssociation, blank = True)
session_types = models.ManyToManyField(TimeSlotTypeName, blank = True)
# floorplan-related properties
floorplan = models.ForeignKey('FloorPlan', null=True, blank=True, default=None)
floorplan = ForeignKey('FloorPlan', null=True, blank=True, default=None)
# floorplan: room pixel position : (0,0) is top left of image, (xd, yd)
# is room width, height.
x1 = models.SmallIntegerField(null=True, blank=True, default=None)
@ -380,8 +381,8 @@ class Room(models.Model):
class UrlResource(models.Model):
"For things like audio stream urls, meetecho stream urls"
name = models.ForeignKey(RoomResourceName)
room = models.ForeignKey(Room)
name = ForeignKey(RoomResourceName)
room = ForeignKey(Room)
url = models.URLField(null=True, blank=True)
def floorplan_path(instance, filename):
@ -392,7 +393,7 @@ class FloorPlan(models.Model):
name = models.CharField(max_length=255)
short = models.CharField(max_length=2, default='')
time = models.DateTimeField(default=datetime.datetime.now)
meeting = models.ForeignKey(Meeting)
meeting = ForeignKey(Meeting)
order = models.SmallIntegerField()
image = models.ImageField(storage=NoLocationMigrationFileSystemStorage(), upload_to=floorplan_path, blank=True, default=None)
#
@ -407,12 +408,12 @@ class TimeSlot(models.Model):
mapped to a time slot, including breaks. Sessions are connected to
TimeSlots during scheduling.
"""
meeting = models.ForeignKey(Meeting)
type = models.ForeignKey(TimeSlotTypeName)
meeting = ForeignKey(Meeting)
type = ForeignKey(TimeSlotTypeName)
name = models.CharField(max_length=255)
time = models.DateTimeField()
duration = models.DurationField(default=datetime.timedelta(0))
location = models.ForeignKey(Room, blank=True, null=True)
location = ForeignKey(Room, blank=True, null=True)
show_location = models.BooleanField(default=True, help_text="Show location in agenda.")
sessions = models.ManyToManyField('Session', related_name='slots', through='SchedTimeSessAssignment', blank=True, help_text=u"Scheduled session, if any.")
modified = models.DateTimeField(auto_now=True)
@ -578,13 +579,13 @@ class Schedule(models.Model):
Secretariat to IESG members for review. Only the owner may edit the
agenda, others may copy it
"""
meeting = models.ForeignKey(Meeting, null=True)
meeting = ForeignKey(Meeting, null=True)
name = models.CharField(max_length=16, blank=False)
owner = models.ForeignKey(Person)
owner = ForeignKey(Person)
visible = models.BooleanField(default=True, help_text=u"Make this agenda available to those who know about it.")
public = models.BooleanField(default=True, help_text=u"Make this agenda publically available.")
badness = models.IntegerField(null=True, blank=True)
# considering copiedFrom = models.ForeignKey('Schedule', blank=True, null=True)
# considering copiedFrom = ForeignKey('Schedule', blank=True, null=True)
def __unicode__(self):
return u"%s:%s(%s)" % (self.meeting, self.name, self.owner)
@ -683,10 +684,10 @@ class SchedTimeSessAssignment(models.Model):
Each relationship is attached to the named agenda, which is owned by
a specific person/user.
"""
timeslot = models.ForeignKey('TimeSlot', null=False, blank=False, related_name='sessionassignments')
session = models.ForeignKey('Session', null=True, default=None, related_name='timeslotassignments', help_text=u"Scheduled session.")
schedule = models.ForeignKey('Schedule', null=False, blank=False, related_name='assignments')
extendedfrom = models.ForeignKey('self', null=True, default=None, help_text=u"Timeslot this session is an extension of.")
timeslot = ForeignKey('TimeSlot', null=False, blank=False, related_name='sessionassignments')
session = ForeignKey('Session', null=True, default=None, related_name='timeslotassignments', help_text=u"Scheduled session.")
schedule = ForeignKey('Schedule', null=False, blank=False, related_name='assignments')
extendedfrom = ForeignKey('self', null=True, default=None, help_text=u"Timeslot this session is an extension of.")
modified = models.DateTimeField(auto_now=True)
notes = models.TextField(blank=True)
badness = models.IntegerField(default=0, blank=True, null=True)
@ -789,12 +790,12 @@ class Constraint(models.Model):
A third type (name=avoidday) of constraint is between source WG and
a particular day of the week, specified in day.
"""
meeting = models.ForeignKey(Meeting)
source = models.ForeignKey(Group, related_name="constraint_source_set")
target = models.ForeignKey(Group, related_name="constraint_target_set", null=True)
person = models.ForeignKey(Person, null=True, blank=True)
meeting = ForeignKey(Meeting)
source = ForeignKey(Group, related_name="constraint_source_set")
target = ForeignKey(Group, related_name="constraint_target_set", null=True)
person = ForeignKey(Person, null=True, blank=True)
day = models.DateTimeField(null=True, blank=True)
name = models.ForeignKey(ConstraintName)
name = ForeignKey(ConstraintName)
active_status = None
@ -828,8 +829,8 @@ class Constraint(models.Model):
class SessionPresentation(models.Model):
session = models.ForeignKey('Session')
document = models.ForeignKey(Document)
session = ForeignKey('Session')
document = ForeignKey(Document)
rev = models.CharField(verbose_name="revision", max_length=16, null=True, blank=True)
order = models.PositiveSmallIntegerField(default=0)
@ -849,18 +850,18 @@ class Session(models.Model):
timeslots are needed, multiple sessions will have to be created.
Training sessions and similar are modeled by filling in a
responsible group (e.g. Edu team) and filling in the name."""
meeting = models.ForeignKey(Meeting)
meeting = ForeignKey(Meeting)
name = models.CharField(blank=True, max_length=255, help_text="Name of session, in case the session has a purpose rather than just being a group meeting.")
short = models.CharField(blank=True, max_length=32, help_text="Short version of 'name' above, for use in filenames.")
type = models.ForeignKey(TimeSlotTypeName)
group = models.ForeignKey(Group) # The group type historically determined the session type. BOFs also need to be added as a group. Note that not all meeting requests have a natural group to associate with.
type = ForeignKey(TimeSlotTypeName)
group = ForeignKey(Group) # The group type historically determined the session type. BOFs also need to be added as a group. Note that not all meeting requests have a natural group to associate with.
attendees = models.IntegerField(null=True, blank=True)
agenda_note = models.CharField(blank=True, max_length=255)
requested = models.DateTimeField(default=datetime.datetime.now)
requested_by = models.ForeignKey(Person)
requested_by = ForeignKey(Person)
requested_duration = models.DurationField(default=datetime.timedelta(0))
comments = models.TextField(blank=True)
status = models.ForeignKey(SessionStatusName)
status = ForeignKey(SessionStatusName)
scheduled = models.DateTimeField(null=True, blank=True)
modified = models.DateTimeField(auto_now=True)
remote_instructions = models.CharField(blank=True,max_length=1024)
@ -1111,8 +1112,8 @@ class Session(models.Model):
return self._agenda_file
class ImportantDate(models.Model):
meeting = models.ForeignKey(Meeting)
meeting = ForeignKey(Meeting)
date = models.DateField()
name = models.ForeignKey(ImportantDateName)
name = ForeignKey(ImportantDateName)
class Meta:
ordering = ["-meeting","date", ]

View file

@ -9,10 +9,11 @@ from ietf.person.models import Person
from ietf.group.models import Group
from ietf.doc.models import Document
from ietf.name.models import RoleName
from ietf.utils.models import ForeignKey, OneToOneField
class Message(models.Model):
time = models.DateTimeField(default=datetime.datetime.now)
by = models.ForeignKey(Person)
by = ForeignKey(Person)
subject = models.CharField(max_length=255)
frm = models.CharField(max_length=255)
@ -35,7 +36,7 @@ class Message(models.Model):
class MessageAttachment(models.Model):
message = models.ForeignKey(Message)
message = ForeignKey(Message)
filename = models.CharField(max_length=255, db_index=True, blank=True)
content_type = models.CharField(max_length=255, blank=True)
encoding = models.CharField(max_length=255, blank=True)
@ -48,9 +49,9 @@ class MessageAttachment(models.Model):
class SendQueue(models.Model):
time = models.DateTimeField(default=datetime.datetime.now)
by = models.ForeignKey(Person)
by = ForeignKey(Person)
message = models.ForeignKey(Message)
message = ForeignKey(Message)
send_at = models.DateTimeField(blank=True, null=True)
sent_at = models.DateTimeField(blank=True, null=True)
@ -65,8 +66,8 @@ class SendQueue(models.Model):
class AnnouncementFrom(models.Model):
name = models.ForeignKey(RoleName)
group = models.ForeignKey(Group)
name = ForeignKey(RoleName)
group = ForeignKey(Group)
address = models.CharField(max_length=255)
def __unicode__(self):

View file

@ -2,6 +2,8 @@
from django.db import models
from ietf.utils.models import ForeignKey, OneToOneField
class NameModel(models.Model):
slug = models.CharField(max_length=32, primary_key=True)
name = models.CharField(max_length=255)
@ -105,7 +107,7 @@ class ContinentName(NameModel):
"Africa, Antarctica, Asia, ..."
class CountryName(NameModel):
"Afghanistan, Aaland Islands, Albania, ..."
continent = models.ForeignKey(ContinentName)
continent = ForeignKey(ContinentName)
in_eu = models.BooleanField(verbose_name="In EU", default=False)
class ImportantDateName(NameModel):
"Registration Opens, Scheduling Opens, ID Cutoff, ..."

View file

@ -23,7 +23,7 @@ from ietf.nomcom.utils import (initialize_templates_for_group,
initialize_requirements_for_position,
initialize_description_for_topic,
delete_nomcom_templates)
from ietf.utils.models import ForeignKey, OneToOneField
from ietf.utils.storage import NoLocationMigrationFileSystemStorage
@ -33,14 +33,14 @@ def upload_path_handler(instance, filename):
class ReminderDates(models.Model):
date = models.DateField()
nomcom = models.ForeignKey('NomCom')
nomcom = ForeignKey('NomCom')
class NomCom(models.Model):
public_key = models.FileField(storage=NoLocationMigrationFileSystemStorage(location=settings.NOMCOM_PUBLIC_KEYS_DIR),
upload_to=upload_path_handler, blank=True, null=True)
group = models.ForeignKey(Group)
group = ForeignKey(Group)
send_questionnaire = models.BooleanField(verbose_name='Send questionnaires automatically', default=False,
help_text='If you check this box, questionnaires are sent automatically after nominations.')
reminder_interval = models.PositiveIntegerField(help_text='If the nomcom user sets the interval field then a cron command will '
@ -83,14 +83,14 @@ post_delete.connect(delete_nomcom, sender=NomCom)
class Nomination(models.Model):
position = models.ForeignKey('Position')
position = ForeignKey('Position')
candidate_name = models.CharField(verbose_name='Candidate name', max_length=255)
candidate_email = models.EmailField(verbose_name='Candidate email', max_length=255)
candidate_phone = models.CharField(verbose_name='Candidate phone', blank=True, max_length=255)
nominee = models.ForeignKey('Nominee')
comments = models.ForeignKey('Feedback')
nominee = ForeignKey('Nominee')
comments = ForeignKey('Feedback')
nominator_email = models.EmailField(verbose_name='Nominator Email', blank=True)
user = models.ForeignKey(User, editable=False)
user = ForeignKey(User, editable=False)
time = models.DateTimeField(auto_now_add=True)
share_nominator = models.BooleanField(verbose_name='Share nominator name with candidate', default=False,
help_text='Check this box to allow the NomCom to let the '
@ -108,11 +108,11 @@ class Nomination(models.Model):
class Nominee(models.Model):
email = models.ForeignKey(Email)
person = models.ForeignKey(Person, blank=True, null=True)
email = ForeignKey(Email)
person = ForeignKey(Person, blank=True, null=True)
nominee_position = models.ManyToManyField('Position', through='NomineePosition')
duplicated = models.ForeignKey('Nominee', blank=True, null=True)
nomcom = models.ForeignKey('NomCom')
duplicated = ForeignKey('Nominee', blank=True, null=True)
nomcom = ForeignKey('NomCom')
objects = NomineeManager()
@ -136,9 +136,9 @@ class Nominee(models.Model):
class NomineePosition(models.Model):
position = models.ForeignKey('Position')
nominee = models.ForeignKey('Nominee')
state = models.ForeignKey(NomineePositionStateName)
position = ForeignKey('Position')
nominee = ForeignKey('Nominee')
state = ForeignKey(NomineePositionStateName)
time = models.DateTimeField(auto_now_add=True)
objects = NomineePositionManager()
@ -164,10 +164,10 @@ class NomineePosition(models.Model):
class Position(models.Model):
nomcom = models.ForeignKey('NomCom')
nomcom = ForeignKey('NomCom')
name = models.CharField(verbose_name='Name', max_length=255, help_text='This short description will appear on the Nomination and Feedback pages. Be as descriptive as necessary. Past examples: "Transport AD", "IAB Member"')
requirement = models.ForeignKey(DBTemplate, related_name='requirement', null=True, editable=False)
questionnaire = models.ForeignKey(DBTemplate, related_name='questionnaire', null=True, editable=False)
requirement = ForeignKey(DBTemplate, related_name='requirement', null=True, editable=False)
questionnaire = ForeignKey(DBTemplate, related_name='questionnaire', null=True, editable=False)
is_open = models.BooleanField(verbose_name='Is open', default=False, help_text="Set is_open when the nomcom is working on a position. Clear it when an appointment is confirmed.")
accepting_nominations = models.BooleanField(verbose_name='Is accepting nominations', default=False)
accepting_feedback = models.BooleanField(verbose_name='Is accepting feedback', default=False)
@ -210,11 +210,11 @@ class Position(models.Model):
return rendered
class Topic(models.Model):
nomcom = models.ForeignKey('NomCom')
nomcom = ForeignKey('NomCom')
subject = models.CharField(verbose_name='Name', max_length=255, help_text='This short description will appear on the Feedback pages.')
description = models.ForeignKey(DBTemplate, related_name='description', null=True, editable=False)
description = ForeignKey(DBTemplate, related_name='description', null=True, editable=False)
accepting_feedback = models.BooleanField(verbose_name='Is accepting feedback', default=False)
audience = models.ForeignKey(TopicAudienceName)
audience = ForeignKey(TopicAudienceName)
class Meta:
verbose_name_plural = 'Topics'
@ -239,15 +239,15 @@ class Topic(models.Model):
return rendered
class Feedback(models.Model):
nomcom = models.ForeignKey('NomCom')
nomcom = ForeignKey('NomCom')
author = models.EmailField(verbose_name='Author', blank=True)
positions = models.ManyToManyField('Position', blank=True)
nominees = models.ManyToManyField('Nominee', blank=True)
topics = models.ManyToManyField('Topic', blank=True)
subject = models.TextField(verbose_name='Subject', blank=True)
comments = EncryptedTextField(verbose_name='Comments')
type = models.ForeignKey(FeedbackTypeName, blank=True, null=True)
user = models.ForeignKey(User, editable=False, blank=True, null=True)
type = ForeignKey(FeedbackTypeName, blank=True, null=True)
user = ForeignKey(User, editable=False, blank=True, null=True)
time = models.DateTimeField(auto_now_add=True)
objects = FeedbackManager()
@ -259,12 +259,12 @@ class Feedback(models.Model):
ordering = ['time']
class FeedbackLastSeen(models.Model):
reviewer = models.ForeignKey(Person)
nominee = models.ForeignKey(Nominee)
reviewer = ForeignKey(Person)
nominee = ForeignKey(Nominee)
time = models.DateTimeField(auto_now=True)
class TopicFeedbackLastSeen(models.Model):
reviewer = models.ForeignKey(Person)
topic = models.ForeignKey(Topic)
reviewer = ForeignKey(Person)
topic = ForeignKey(Topic)
time = models.DateTimeField(auto_now=True)

View file

@ -24,6 +24,7 @@ from ietf.utils.mail import send_mail_preformatted
from ietf.utils.storage import NoLocationMigrationFileSystemStorage
from ietf.utils.mail import formataddr
from ietf.person.name import unidecode_name
from ietf.utils.models import ForeignKey, OneToOneField
class PersonInfo(models.Model):
@ -157,7 +158,7 @@ class PersonInfo(models.Model):
abstract = True
class Person(PersonInfo):
user = models.OneToOneField(User, blank=True, null=True)
user = OneToOneField(User, blank=True, null=True)
def save(self, *args, **kwargs):
created = not self.pk
@ -197,8 +198,8 @@ class Person(PersonInfo):
return ct1
class PersonHistory(PersonInfo):
person = models.ForeignKey(Person, related_name="history_set")
user = models.ForeignKey(User, blank=True, null=True)
person = ForeignKey(Person, related_name="history_set")
user = ForeignKey(User, blank=True, null=True)
class Alias(models.Model):
"""This is used for alternative forms of a name. This is the
@ -206,7 +207,7 @@ class Alias(models.Model):
unicode form (and ascii form, if different) of a name which is
recorded in the Person record.
"""
person = models.ForeignKey(Person)
person = ForeignKey(Person)
name = models.CharField(max_length=255, db_index=True)
def save(self, *args, **kwargs):
@ -229,7 +230,7 @@ class Alias(models.Model):
class Email(models.Model):
address = models.CharField(max_length=64, primary_key=True, validators=[validate_email])
person = models.ForeignKey(Person, null=True)
person = ForeignKey(Person, null=True)
time = models.DateTimeField(auto_now_add=True)
primary = models.BooleanField(default=False)
active = models.BooleanField(default=True) # Old email addresses are *not* purged, as history
@ -290,7 +291,7 @@ PERSON_API_KEY_ENDPOINTS = [
]
class PersonalApiKey(models.Model):
person = models.ForeignKey(Person, related_name='apikeys')
person = ForeignKey(Person, related_name='apikeys')
endpoint = models.CharField(max_length=128, null=False, blank=False, choices=PERSON_API_KEY_ENDPOINTS)
created = models.DateTimeField(default=datetime.datetime.now, null=False)
valid = models.BooleanField(default=True)
@ -331,7 +332,7 @@ PERSON_EVENT_CHOICES = [
]
class PersonEvent(models.Model):
person = models.ForeignKey(Person)
person = ForeignKey(Person)
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened")
type = models.CharField(max_length=50, choices=PERSON_EVENT_CHOICES)
desc = models.TextField()
@ -343,5 +344,5 @@ class PersonEvent(models.Model):
ordering = ['-time', '-id']
class PersonApiKeyEvent(PersonEvent):
key = models.ForeignKey(PersonalApiKey)
key = ForeignKey(PersonalApiKey)

View file

@ -2,6 +2,8 @@
from django.db import models
from ietf.utils.models import ForeignKey, OneToOneField
class Redirect(models.Model):
"""Mapping of CGI script to url. The "rest" is a
sprintf-style string with %(param)s entries to insert
@ -42,8 +44,8 @@ class Command(models.Model):
"""
command = models.CharField(max_length=50)
url = models.CharField(max_length=50, blank=True)
script = models.ForeignKey(Redirect, related_name='commands', editable=False)
suffix = models.ForeignKey(Suffix, null=True, blank=True)
script = ForeignKey(Redirect, related_name='commands', editable=False)
suffix = ForeignKey(Suffix, null=True, blank=True)
def __str__(self):
ret = "%s?command=%s" % (self.script.cgi, self.command)
if self.suffix_id:

View file

@ -7,11 +7,12 @@ from ietf.group.models import Group
from ietf.person.models import Person, Email
from ietf.name.models import ReviewTypeName, ReviewRequestStateName, ReviewResultName
from ietf.utils.validators import validate_regular_expression_string
from ietf.utils.models import ForeignKey, OneToOneField
class ReviewerSettings(models.Model):
"""Keeps track of admin data associated with a reviewer in a team."""
team = models.ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = models.ForeignKey(Person)
team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = ForeignKey(Person)
INTERVALS = [
(7, "Once per week"),
(14, "Once per fortnight"),
@ -35,8 +36,8 @@ class ReviewerSettings(models.Model):
class ReviewSecretarySettings(models.Model):
"""Keeps track of admin data associated with a secretary in a team."""
team = models.ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = models.ForeignKey(Person)
team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = ForeignKey(Person)
remind_days_before_deadline = models.IntegerField(null=True, blank=True, help_text="To get an email reminder in case a reviewer forgets to do an assigned review, enter the number of days before review deadline you want to receive it. Clear the field if you don't want a reminder.")
def __unicode__(self):
@ -46,8 +47,8 @@ class ReviewSecretarySettings(models.Model):
verbose_name_plural = "review secretary settings"
class UnavailablePeriod(models.Model):
team = models.ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = models.ForeignKey(Person)
team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = ForeignKey(Person)
start_date = models.DateField(default=datetime.date.today, null=True, help_text="Choose the start date so that you can still do a review if it's assigned just before the start date - this usually means you should mark yourself unavailable for assignment some time before you are actually away.")
end_date = models.DateField(blank=True, null=True, help_text="Leaving the end date blank means that the period continues indefinitely. You can end it later.")
AVAILABILITY_CHOICES = [
@ -77,9 +78,9 @@ class UnavailablePeriod(models.Model):
class ReviewWish(models.Model):
"""Reviewer wishes to review a document when it becomes available for review."""
time = models.DateTimeField(default=datetime.datetime.now)
team = models.ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = models.ForeignKey(Person)
doc = models.ForeignKey(Document)
team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = ForeignKey(Person)
doc = ForeignKey(Document)
def __unicode__(self):
return u"{} wishes to review {} in {}".format(self.person, self.doc.name, self.team.acronym)
@ -89,8 +90,8 @@ class ReviewWish(models.Model):
class NextReviewerInTeam(models.Model):
team = models.ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
next_reviewer = models.ForeignKey(Person)
team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
next_reviewer = ForeignKey(Person)
def __unicode__(self):
return u"{} next in {}".format(self.next_reviewer, self.team)
@ -103,18 +104,18 @@ class ReviewRequest(models.Model):
"""Represents a request for a review and the process it goes through.
There should be one ReviewRequest entered for each combination of
document, rev, and reviewer."""
state = models.ForeignKey(ReviewRequestStateName)
state = ForeignKey(ReviewRequestStateName)
old_id = models.IntegerField(blank=True, null=True, help_text="ID in previous review system") # FIXME: remove this when everything has been migrated
# Fields filled in on the initial record creation - these
# constitute the request part.
time = models.DateTimeField(default=datetime.datetime.now)
type = models.ForeignKey(ReviewTypeName)
doc = models.ForeignKey(Document, related_name='reviewrequest_set')
team = models.ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
type = ForeignKey(ReviewTypeName)
doc = ForeignKey(Document, related_name='reviewrequest_set')
team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
deadline = models.DateField()
requested_by = models.ForeignKey(Person)
requested_by = ForeignKey(Person)
requested_rev = models.CharField(verbose_name="requested revision", max_length=16, blank=True, help_text="Fill in if a specific revision is to be reviewed, e.g. 02")
comment = models.TextField(verbose_name="Requester's comments and instructions", max_length=2048, blank=True, help_text="Provide any additional information to show to the review team secretary and reviewer", default='')
@ -123,11 +124,11 @@ class ReviewRequest(models.Model):
# requested/assigned, any changes to the assignment happens by
# closing down the current request and making a new one, copying
# the request-part fields above.
reviewer = models.ForeignKey(Email, blank=True, null=True)
reviewer = ForeignKey(Email, blank=True, null=True)
review = models.OneToOneField(Document, blank=True, null=True)
review = OneToOneField(Document, blank=True, null=True)
reviewed_rev = models.CharField(verbose_name="reviewed revision", max_length=16, blank=True)
result = models.ForeignKey(ReviewResultName, blank=True, null=True)
result = ForeignKey(ReviewResultName, blank=True, null=True)
def __unicode__(self):
return u"%s review on %s by %s %s" % (self.type, self.doc, self.team, self.state)
@ -155,7 +156,7 @@ def get_default_review_results():
class ReviewTeamSettings(models.Model):
"""Holds configuration specific to groups that are review teams"""
group = models.OneToOneField(Group)
group = OneToOneField(Group)
autosuggest = models.BooleanField(default=True, verbose_name="Automatically suggest possible review requests")
review_types = models.ManyToManyField(ReviewTypeName, default=get_default_review_types)
review_results = models.ManyToManyField(ReviewResultName, default=get_default_review_results)

View file

@ -11,7 +11,7 @@ class GeneralInfo(models.Model):
db_table = u'general_info'
class MeetingVenue(models.Model):
meeting_num = models.ForeignKey(Meeting, db_column='meeting_num', unique=True, editable=False)
meeting_num = ForeignKey(Meeting, db_column='meeting_num', unique=True, editable=False)
break_area_name = models.CharField(max_length=255)
reg_area_name = models.CharField(max_length=255)
def __str__(self):
@ -32,8 +32,8 @@ class NonSessionRef(models.Model):
class NonSession(models.Model):
non_session_id = models.AutoField(primary_key=True, editable=False)
day_id = models.IntegerField(blank=True, null=True, editable=False)
non_session_ref = models.ForeignKey(NonSessionRef, editable=False)
meeting = models.ForeignKey(Meeting, db_column='meeting_num', editable=False)
non_session_ref = ForeignKey(NonSessionRef, editable=False)
meeting = ForeignKey(Meeting, db_column='meeting_num', editable=False)
time_desc = models.CharField(blank=True, max_length=75, default='0')
show_break_location = models.BooleanField(editable=False, default=True)
def __str__(self):

View file

@ -4,6 +4,7 @@ from django.conf import settings
from django.db import models
from ietf.meeting.models import Meeting
from ietf.utils.models import ForeignKey, OneToOneField
class InterimManager(models.Manager):

View file

@ -1,7 +1,13 @@
# Copyright The IETF Trust 2017, All Rights Reserved
from django.db import models
import debug # pyflakes:ignore
from ietf.meeting.models import Meeting
from ietf.name.models import CountryName
from ietf.person.models import Person
from ietf.utils.models import ForeignKey, OneToOneField
class AffiliationAlias(models.Model):
@ -34,7 +40,7 @@ class CountryAlias(models.Model):
purposes."""
alias = models.CharField(max_length=255, help_text="Note that lower-case aliases are matched case-insensitive while aliases with at least one uppercase letter is matched case-sensitive. So 'United States' is best entered as 'united states' so it both matches 'United States' and 'United states' and 'UNITED STATES', whereas 'US' is best entered as 'US' so it doesn't accidentally match an ordinary word like 'us'.")
country = models.ForeignKey(CountryName, max_length=255)
country = ForeignKey(CountryName, max_length=255)
def __unicode__(self):
return u"{} -> {}".format(self.alias, self.country.name)
@ -44,12 +50,12 @@ class CountryAlias(models.Model):
class MeetingRegistration(models.Model):
"""Registration attendee records from the IETF registration system"""
meeting = models.ForeignKey(Meeting)
meeting = ForeignKey(Meeting)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
affiliation = models.CharField(blank=True, max_length=255)
country_code = models.CharField(max_length=2) # ISO 3166
person = models.ForeignKey(Person, blank=True, null=True)
person = ForeignKey(Person, blank=True, null=True)
email = models.EmailField(blank=True, null=True)
def __unicode__(self):

View file

@ -12,6 +12,7 @@ from ietf.group.models import Group
from ietf.message.models import Message
from ietf.name.models import DraftSubmissionStateName, FormalLanguageName
from ietf.utils.accesstoken import generate_random_key, generate_access_token
from ietf.utils.models import ForeignKey, OneToOneField
def parse_email_line(line):
@ -23,7 +24,7 @@ def parse_email_line(line):
return dict(name=name, email=addr)
class Submission(models.Model):
state = models.ForeignKey(DraftSubmissionStateName)
state = ForeignKey(DraftSubmissionStateName)
remote_ip = models.CharField(max_length=100, blank=True)
access_key = models.CharField(max_length=255, default=generate_random_key)
@ -31,7 +32,7 @@ class Submission(models.Model):
# draft metadata
name = models.CharField(max_length=255, db_index=True)
group = models.ForeignKey(Group, null=True, blank=True)
group = ForeignKey(Group, null=True, blank=True)
title = models.CharField(max_length=255, blank=True)
abstract = models.TextField(blank=True)
rev = models.CharField(max_length=3, blank=True)
@ -51,7 +52,7 @@ class Submission(models.Model):
submitter = models.CharField(max_length=255, blank=True, help_text="Name and email of submitter, e.g. \"John Doe &lt;john@example.org&gt;\".")
draft = models.ForeignKey(Document, null=True, blank=True)
draft = ForeignKey(Document, null=True, blank=True)
def __unicode__(self):
return u"%s-%s" % (self.name, self.rev)
@ -71,7 +72,7 @@ class Submission(models.Model):
class SubmissionCheck(models.Model):
time = models.DateTimeField(default=datetime.datetime.now)
submission = models.ForeignKey(Submission, related_name='checks')
submission = ForeignKey(Submission, related_name='checks')
checker = models.CharField(max_length=256, blank=True)
passed = models.NullBooleanField(default=False)
message = models.TextField(null=True, blank=True)
@ -88,9 +89,9 @@ class SubmissionCheck(models.Model):
return self.errors != '[]'
class SubmissionEvent(models.Model):
submission = models.ForeignKey(Submission)
submission = ForeignKey(Submission)
time = models.DateTimeField(default=datetime.datetime.now)
by = models.ForeignKey(Person, null=True, blank=True)
by = ForeignKey(Person, null=True, blank=True)
desc = models.TextField()
def __unicode__(self):
@ -103,16 +104,16 @@ class SubmissionEvent(models.Model):
class Preapproval(models.Model):
"""Pre-approved draft submission name."""
name = models.CharField(max_length=255, db_index=True)
by = models.ForeignKey(Person)
by = ForeignKey(Person)
time = models.DateTimeField(default=datetime.datetime.now)
def __unicode__(self):
return self.name
class SubmissionEmailEvent(SubmissionEvent):
message = models.ForeignKey(Message, null=True, blank=True,related_name='manualevents')
message = ForeignKey(Message, null=True, blank=True,related_name='manualevents')
msgtype = models.CharField(max_length=25)
in_reply_to = models.ForeignKey(Message, null=True, blank=True,related_name='irtomanual')
in_reply_to = ForeignKey(Message, null=True, blank=True,related_name='irtomanual')
def __unicode__(self):
return u"%s %s by %s at %s" % (self.submission.name, self.desc, self.by.plain_name() if self.by else "(unknown)", self.time)

View file

@ -37,7 +37,7 @@ sitemaps = {
urlpatterns = [
url(r'^$', views_search.frontpage),
url(r'^accounts/', include('ietf.ietfauth.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^admin/', admin.site.urls),
url(r'^admin/docs/', include('django.contrib.admindocs.urls')),
url(r'^ann/', include('ietf.nomcom.redirect_ann_urls')),
url(r'^api/', include('ietf.api.urls')),

View file

@ -5,7 +5,7 @@ import html5lib
import bleach
from html5lib import sanitizer, serializer, tokenizer, treebuilders, treewalkers
from django.utils.functional import allow_lazy
from django.utils.functional import keep_lazy
from django.utils import six
acceptable_elements = ('a', 'abbr', 'acronym', 'address', 'b', 'big',
@ -67,7 +67,7 @@ def remove_tags(html, tags):
"""Returns the given HTML sanitized, and with the given tags removed."""
allowed = set(acceptable_elements) - set([ t.lower() for t in tags ])
return bleach.clean(html, tags=allowed)
remove_tags = allow_lazy(remove_tags, six.text_type)
remove_tags = keep_lazy(remove_tags, six.text_type)
def clean_html(html):
return bleach.clean(html)

View file

@ -5,7 +5,7 @@ import textwrap
import types
import unicodedata
from django.utils.functional import allow_lazy
from django.utils.functional import keep_lazy
from django.utils import six
from django.utils.safestring import mark_safe
@ -21,7 +21,7 @@ def xslugify(value):
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
value = re.sub('[^\w\s/-]', '', value).strip().lower()
return mark_safe(re.sub('[-\s/]+', '-', value))
xslugify = allow_lazy(xslugify, six.text_type)
xslugify = keep_lazy(xslugify, six.text_type)
def strip_prefix(text, prefix):
if text.startswith(prefix):

View file

@ -1,6 +1,6 @@
--- django/db/models/fields/__init__.py.old 2017-06-14 08:43:21.665812000 -0700
+++ django/db/models/fields/__init__.py 2017-12-17 14:34:03.023976702 -0800
@@ -2323,7 +2323,7 @@
@@ -2344,7 +2344,7 @@
if self.has_default() and not callable(self.default):
return self.default
default = super(BinaryField, self).get_default()