From f497e0a934f2665d7f7f4c9da27f19e74fd813ed Mon Sep 17 00:00:00 2001 From: Nicolas Iooss Date: Thu, 17 Sep 2015 00:08:25 +0200 Subject: [PATCH] Import Django model for the database --- database/platal_models.py | 2321 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2321 insertions(+) create mode 100644 database/platal_models.py diff --git a/database/platal_models.py b/database/platal_models.py new file mode 100644 index 0000000..29f4761 --- /dev/null +++ b/database/platal_models.py @@ -0,0 +1,2321 @@ +# -*- coding: utf-8 -*- +#*************************************************************************** +#* Copyright (C) 2015 Polytechnique.org * +#* http://opensource.polytechnique.org/ * +#* * +#* This program is free software; you can redistribute it and/or modify * +#* it under the terms of the GNU General Public License as published by * +#* the Free Software Foundation; either version 2 of the License, or * +#* (at your option) any later version. * +#* * +#* This program is distributed in the hope that it will be useful, * +#* but WITHOUT ANY WARRANTY; without even the implied warranty of * +#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +#* GNU General Public License for more details. * +#* * +#* You should have received a copy of the GNU General Public License * +#* along with this program; if not, write to the Free Software * +#* Foundation, Inc., * +#* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +#***************************************************************************/ +"""Django models which fit the latest version of Plat/al database + +Latest version synced: Plat/al 1.1.15 +https://github.com/Polytechnique-org/platal/tree/xorg/maint/upgrade + +This requires Django to work. +""" +import collections +from django.db import models + + +def is_ax_visible(field): + return field in ('public', 'ax') + + +# Misc for Account/Profile +# ======================== + + +class Skin(models.Model): + #id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=96) + date = models.DateField() + comment = models.CharField(max_length=765) + auteur = models.CharField(max_length=90) + skin_tpl = models.CharField(max_length=96) + ext = models.CharField(max_length=9) + class Meta: + db_table = u'skins' + + def __unicode__(self): + return self.name + + +class EmailVirtualDomain(models.Model): + #id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=765) + aliasing = models.ForeignKey('self', db_column='aliasing') + class Meta: + db_table = u'email_virtual_domains' + + def __unicode__(self): + return self.name + + +class ProfileSectionEnum(models.Model): + #id = models.IntegerField(primary_key=True) + text = models.CharField(max_length=150, unique=True) + class Meta: + db_table = u'profile_section_enum' + + def __unicode__(self): + return self.text + + +class GeolocCountry(models.Model): + iso_3166_1_a2 = models.CharField(max_length=6, primary_key=True) + iso_3166_1_a3 = models.CharField(max_length=9, unique=True) + iso_3166_1_num = models.IntegerField(unique=True) + worldregion = models.CharField(max_length=6, db_column='worldRegion', blank=True) # Field name made lowercase. + country = models.CharField(max_length=765, blank=True) + countryen = models.CharField(max_length=765, db_column='countryEn', blank=True) # Field name made lowercase. + capital = models.CharField(max_length=765) + nationality = models.CharField(max_length=765, blank=True) + nationalityen = models.CharField(max_length=765, db_column='nationalityEn', blank=True) # Field name made lowercase. + phoneprefix = models.IntegerField(null=True, db_column='phonePrefix', blank=True) # Field name made lowercase. + phoneformat = models.CharField(max_length=765, db_column='phoneFormat') # Field name made lowercase. + licenseplate = models.CharField(max_length=12, db_column='licensePlate', blank=True) # Field name made lowercase. + belongsto = models.ForeignKey('self', null=True, db_column='belongsTo', blank=True) # Field name made lowercase. + countryplain = models.CharField(max_length=765, db_column='countryPlain', blank=True) # Field name made lowercase. + class Meta: + db_table = u'geoloc_countries' + + def __unicode__(self): + return self.iso_3166_1_a2 + + +# Account/Profile +# =============== + + +class AccountType(models.Model): + type = models.CharField(max_length=48, primary_key=True) + perms = models.CharField(max_length=321) + description = models.TextField(blank=True) + class Meta: + db_table = u'account_types' + + def __unicode__(self): + return self.type + + +class Account(models.Model): + uid = models.AutoField(primary_key=True) + hruid = models.CharField(max_length=255, unique=True) + type = models.ForeignKey(AccountType, null=True, db_column='type', blank=True) + user_perms = models.CharField(max_length=288, blank=True) + is_admin = models.BooleanField() + state = models.CharField(max_length=24) + password = models.CharField(max_length=120, blank=True) + token = models.CharField(max_length=96, blank=True) + weak_password = models.CharField(max_length=768, blank=True) + registration_date = models.DateTimeField() + flags = models.CharField(max_length=15) + comment = models.CharField(max_length=765, blank=True) + email = models.CharField(max_length=765, blank=True) + firstname = models.CharField(max_length=765, blank=True) + lastname = models.CharField(max_length=765, blank=True) + full_name = models.CharField(max_length=765, blank=True) + directory_name = models.CharField(max_length=765, blank=True) + sort_name = models.CharField(max_length=765, blank=True) + display_name = models.CharField(max_length=765, blank=True) + sex = models.CharField(max_length=18) + email_format = models.CharField(max_length=12) + skin = models.ForeignKey(Skin, null=True, db_column='skin', blank=True) + last_version = models.CharField(max_length=48) + best_domain = models.ForeignKey(EmailVirtualDomain, null=True, db_column='best_domain', blank=True) + from_email = models.CharField(max_length=765) + from_format = models.CharField(max_length=12) + class Meta: + db_table = u'accounts' + + def __unicode__(self): + return u'%s (%s)' % (self.hruid, self.full_name) + + @property + def profile(self): + return self.profiles.filter(perms='owner').get().profile + + +class ProfileAlias(object): + def __init__(self, alias_of, kind, lastname, firstname=None): + self.alias_of = alias_of + self.kind = kind + self.lastname = lastname + self.firstname = alias_of.firstname if firstname is None else firstname + + ALT_MARITAL = 'marital' + ALT_PSEUDO = 'pseudo' + ALT_ORDINARY = 'ordinary' + + @property + def is_pseudo(self): + return self.kind == self.ALT_PSEUDO + + def get_kind_display(self): + if self.kind == self.ALT_MARITAL: + if self.female: + return u"Mme" + else: + return u"M." + elif self.kind == self.ALT_PSEUDO: + return u"Pseudonyme" + else: + return u"" + + def __getattr__(self, attr): + return getattr(self.alias_of, attr) + + def __repr__(self): + return '' % (self.kind, self.alias_of) + + +class Profile(models.Model): + + alias_of = None + + def __init__(self, *args, **kwargs): + super(Profile, self).__init__(*args, **kwargs) + self._aliases = None + + pid = models.AutoField(primary_key=True) + hrpid = models.CharField(max_length=255, unique=True) + xorg_id = models.IntegerField() + ax_id = models.CharField(max_length=24, blank=True) + birthdate = models.DateField(null=True, blank=True) + birthdate_ref = models.DateField(null=True, blank=True) + next_birthday = models.DateField(null=True, blank=True) + deathdate = models.DateField(null=True, blank=True) + deathdate_rec = models.DateField(null=True, blank=True) + sex = models.CharField(max_length=18) + section = models.ForeignKey(ProfileSectionEnum, null=True, db_column='section', blank=True) + cv = models.TextField(blank=True) + freetext = models.TextField(blank=True) + freetext_pub = models.CharField(max_length=21) + medals_pub = models.CharField(max_length=21) + alias_pub = models.CharField(max_length=21) + nationality1 = models.ForeignKey(GeolocCountry, null=True, db_column='nationality1', blank=True, related_name='natives') + nationality2 = models.ForeignKey(GeolocCountry, null=True, db_column='nationality2', blank=True, related_name='second_natives') + nationality3 = models.ForeignKey(GeolocCountry, null=True, db_column='nationality3', blank=True, related_name='third_natives') + email_directory = models.CharField(max_length=765, blank=True) + last_change = models.DateField() + title = models.CharField(max_length=12) + + class Meta: + db_table = u'profiles' + + def __unicode__(self): + return self.hrpid + + @property + def is_alive(self): + return self.deathdate is None + + @property + def account(self): + return self.accounts.filter(perms='owner').get().account + + @property + def firstname(self): + return self.public_name.firstname_ordinary or self.public_name.firstname_main or self.public_name.firstname_initial + + @property + def lastname(self): + return self.public_name.lastname_main or self.public_name.lastname_initial + + @property + def lastname_display(self): + return self.public_name.lastname_ordinary or self.public_name.lastname_marital or self.public_name.lastname_main or self.public_name.lastname_initial + + @property + def lastname_marital(self): + return self.public_name.lastname_marital + + @property + def lastname_ordinary(self): + return self.public_name.lastname_ordinary + + @property + def pseudonym(self): + return self.public_name.pseudonym + + @property + def promo(self): + return self.profiledisplay.promo + + @property + def female(self): + return self.sex == 'female' + + @property + def nationality(self): + return self.nationality1 or self.nationality2 or self.nationality3 + + @property + def country_code(self): + nat = self.nationality + if nat is None: + return 'FR' + return nat.iso_3166_1_a2 + + @property + def country_name(self): + nat = self.nationality + if nat is None: + return u"France" + return nat.country + + @property + def current_corps(self): + try: + return self.profilecorps.current + except ProfileCorps.DoesNotExist: + return None + + def get_aliases(self, include_deviations=True): + if self._aliases is None: + self._aliases = [] + + alt_names = set([self.lastname]) + if self.lastname_marital and self.lastname_marital not in alt_names: + alt_names.add(self.lastname_marital) + self._aliases.append( + ProfileAlias(self, ProfileAlias.ALT_MARITAL, self.lastname_marital)) + + if self.lastname_ordinary and self.lastname_ordinary not in alt_names: + # Some people filled 'ordinary' instead of 'marital' + alt_names.add(self.lastname_ordinary) + self._aliases.append( + ProfileAlias(self, ProfileAlias.ALT_ORDINARY, self.lastname_ordinary)) + + if self.pseudonym and self.pseudonym not in alt_names: + alt_names.add(self.pseudonym) + self._aliases.append( + ProfileAlias(self, ProfileAlias.ALT_PSEUDO, self.pseudonym, firstname='')) + + if include_deviations: + return self._aliases + else: + return [a for a in self._aliases + if not a.lastname.startswith(self.lastname) + and not self.lastname.startswith(a.lastname) + ] + + @property + def mobile_line(self): + if not hasattr(self, '_mobiles'): + mobiles = [phone + for phone in self.phones.all() + if phone.link_type == phone.LINK_USER and phone.tel_type == phone.KIND_MOBILE + ] + self._mobiles = sorted(mobiles, key=lambda p: p.tel_id) + if self._mobiles: + return self._mobiles[0] + return None + + def sorted_addresses(self, for_ax=False): + personal_addresses = [addr + for addr in self.addresses.all() + if addr.is_home and (addr.ax_visible or not for_ax) + ] + + address_phones = collections.defaultdict(lambda: collections.defaultdict(list)) + + for phone in self.phones.all(): + if phone.is_address and (phone.ax_visible or not for_ax): + address_phones[phone.link_id][phone.tel_type].append(phone) + + for address in personal_addresses: + addr_phones = {} + for kind, phones in address_phones[address.subid].items(): + if phones: + addr_phones[kind] = sorted(phones, key=lambda p: p.tel_id)[0] + else: + addr_phones[kind] = None + address.phones = addr_phones + + current = [addr for addr in personal_addresses if addr.current] + secondary = [addr for addr in personal_addresses if addr.secondary and not addr.current] + if not current: + current, secondary = secondary, [] + + return [(a, True) for a in current] + [(a, False) for a in secondary] + + def sorted_educations(self): + edus = [edu for edu in self.educations.all() if edu.school and edu.school.abbreviation != 'X'] + return sorted(edus, key=lambda edu: edu.entry_year) + + def sorted_jobs(self): + jobs = sorted(self.jobs.all(), key=lambda j: (j.id, j.entry_year)) + job_addresses = {} + for addr in self.addresses.all(): + if addr.is_job: + job_addresses[addr.job_id] = addr + + job_phones = collections.defaultdict(lambda: collections.defaultdict(list)) + for phone in self.phones.all(): + if phone.is_job: + job_phones[phone.link_id][phone.tel_type].append(phone) + + for job in jobs: + job.address = job_addresses.get(job.id) + j_phones = {} + for kind, phones in job_phones[job.id].items(): + if phones: + j_phones[kind] = sorted(phones, key=lambda p: p.tel_id)[0] + else: + j_phones[kind] = None + job.phones = j_phones + + return jobs + + +class AccountProfile(models.Model): + account = models.ForeignKey(Account, db_column='uid', related_name='profiles') + profile = models.ForeignKey(Profile, db_column='pid', related_name='accounts') + pkey = models.CompositeField(account, profile, primary_key=True) + perms = models.CharField(max_length=15) + class Meta: + db_table = u'account_profiles' + + def __unicode__(self): + return u'%s -> %s' % (self.account.hruid, self.profile.hrpid) + + +# Account-related +# =============== + + +class AccountAuthOpenid(models.Model): + #id = models.IntegerField(primary_key=True) + account = models.ForeignKey(Account, unique=True, null=True, db_column='uid', blank=True) + url = models.CharField(max_length=255, unique=True) + class Meta: + db_table = u'account_auth_openid' + + def __unicode__(self): + return u"%s at %s" % (self.account, self.url) + +class AccountLostPassword(models.Model): + certificat = models.CharField(max_length=96, primary_key=True) + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + created = models.DateTimeField(null=True, blank=True) + class Meta: + db_table = u'account_lost_passwords' + + def __unicode__(self): + return u"%s on %s" % (self.account.hruid, self.created) + + +class AccountXnetLostPassword(models.Model): + account = models.ForeignKey(Account, primary_key=True, db_column='uid') + date = models.DateTimeField(null=True, blank=True) + hash = models.CharField(max_length=96) + class Meta: + db_table = u'account_xnet_lost_passwords' + + def __unicode__(self): + return u"%s on %s" % (self.account.hruid, self.date) + + +# Announces +# ========= + + +class Announce(models.Model): + #id = models.IntegerField(primary_key=True) + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + creation_date = models.DateTimeField() + titre = models.CharField(max_length=765) + texte = models.TextField() + expiration = models.DateField() + promo_min = models.IntegerField() + promo_max = models.IntegerField() + flags = models.CharField(max_length=87) + noinvite = models.IntegerField() + post_id = models.IntegerField(null=True, blank=True, editable=False, + help_text=u"NNTP post identifier") + class Meta: + db_table = u'announces' + + def __unicode__(self): + return u"%s: %s" % (self.id, self.titre) + + +class AnnouncePhoto(models.Model): + eid = models.ForeignKey(Announce, primary_key=True, db_column='eid') + attachmime = models.CharField(max_length=12) + attach = models.TextField() + x = models.IntegerField() + y = models.IntegerField() + class Meta: + db_table = u'announce_photos' + + def __unicode__(self): + return u"%s (%s, %d x %d)" % (self.eid, self.attachmime, self.x, self.y) + + +class AnnounceRead(models.Model): + evt = models.ForeignKey(Announce) + account = models.ForeignKey(Account, db_column='uid') + pkey = models.CompositeField(evt, account, primary_key=True) + class Meta: + db_table = u'announce_read' + + def __unicode__(self): + return u"%s: %s" % (self.account, self.evt) + + +# Email routing +# ============= + + +class EmailVirtual(models.Model): + email = models.CharField(max_length=255) + domain = models.ForeignKey(EmailVirtualDomain, db_column='domain') + pkey = models.CompositeField(email, domain, primary_key=True) + redirect = models.CharField(max_length=765) + type = models.CharField(max_length=21, blank=True) + expire = models.DateField() + class Meta: + db_table = u'email_virtual' + + def __unicode__(self): + return u"%s@%s (%s)" % (self.email, self.domain, self.type) + + +class EmailRedirectAccount(models.Model): + account = models.ForeignKey(Account, db_column='uid') + redirect = models.CharField(max_length=765) + pkey = models.CompositeField(account, redirect, primary_key=True) + rewrite = models.CharField(max_length=765) + type = models.CharField(max_length=30) + action = models.CharField(max_length=54) + broken_date = models.DateField() + broken_level = models.IntegerField() + last = models.DateField() + flags = models.CharField(max_length=24) + hash = models.CharField(max_length=96, blank=True) + allow_rewrite = models.BooleanField() + class Meta: + db_table = u'email_redirect_account' + + def __unicode__(self): + return u"%s for %s (%s)" % (self.redirect, self.account.hruid, self.type) + + +class EmailSourceAccount(models.Model): + email = models.CharField(max_length=255) + domain = models.ForeignKey(EmailVirtualDomain, db_column='domain') + pkey = models.CompositeField(email, domain, primary_key=True) + + account = models.ForeignKey(Account, db_column='uid') + type = models.CharField(max_length=27) + flags = models.CharField(max_length=69) + expire = models.DateField(null=True, blank=True) + class Meta: + db_table = u'email_source_account' + + def __unicode__(self): + return u"%s@%s (%s)" % (self.email, self.domain, self.type) + + +class EmailSourceOther(models.Model): + email = models.CharField(max_length=255) + domain = models.ForeignKey(EmailVirtualDomain, db_column='domain') + pkey = models.CompositeField(email, domain, primary_key=True) + + hrmid = models.CharField(max_length=765) + type = models.CharField(max_length=24, blank=True) + expire = models.DateField(null=True, blank=True) + class Meta: + db_table = u'email_source_other' + + def __unicode__(self): + return u"%s@%s (%s)" % (self.email, self.domain, self.type) + + +class EmailRedirectOther(models.Model): + hrmid = models.ForeignKey(EmailSourceOther, db_column='hrmid') + redirect = models.CharField(max_length=765) + pkey = models.CompositeField(hrmid, redirect, primary_key=True) + type = models.CharField(max_length=30) + action = models.CharField(max_length=54) + class Meta: + db_table = u'email_redirect_other' + + def __unicode__(self): + return u"%s -> %s (%s)" % (self.hrmid, self.redirect, self.type) + + +# innd-related +# ============ + + +class InndForum(models.Model): + """ACLs for innd""" + id_innd = models.AutoField(primary_key=True) + ipmin = models.IntegerField(null=True, blank=True) + ipmax = models.IntegerField(null=True, blank=True) + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + read_perm = models.CharField(max_length=300, blank=True) + write_perm = models.CharField(max_length=300, blank=True) + priority = models.IntegerField(null=True, blank=True) + comment = models.TextField(blank=True) + class Meta: + db_table = u'forum_innd' + + def __unicode__(self): + return "%d: %s" % (self.id_innd, self.account.hruid) + + +class ForumProfile(models.Model): + account = models.ForeignKey(Account, primary_key=True, db_column='uid') + name = models.CharField(max_length=192) + mail = models.CharField(max_length=210) + sig = models.TextField() + flags = models.CharField(max_length=63) + tree_unread = models.CharField(max_length=24) + tree_read = models.CharField(max_length=24) + last_seen = models.DateTimeField() + class Meta: + db_table = u'forum_profiles' + + def __unicode__(self): + return u"%s: %s" % (self.account.hruid, self.name) + + +class Forum(models.Model): + fid = models.IntegerField(primary_key=True) + name = models.CharField(max_length=192) + class Meta: + db_table = u'forums' + + def __unicode__(self): + return self.name + + +class ForumSubs(models.Model): + forum = models.ForeignKey(Forum, db_column='fid') + account = models.ForeignKey(Account, db_column='uid') + pkey = models.CompositeField(forum, account, primary_key=True) + class Meta: + db_table = u'forum_subs' + + def __unicode__(self): + return u"%s by %s" % (self.forum.name, self.account.hruid) + + +# Payments +# ======== + + +class PaymentBankAccount(models.Model): + #id = models.IntegerField(primary_key=True) + asso = models.ForeignKey('Group', blank=True, null=True) + iban = models.CharField(max_length=33) + owner = models.CharField(max_length=300) + status = models.CharField(max_length=36) + bic = models.CharField(max_length=11) + class Meta: + db_table = u'payment_bankaccounts' + + def __unicode__(self): + return u'%s: %s' % (self.asso.name, self.account) + + +class Payment(models.Model): + #id = models.IntegerField(primary_key=True) + text = models.CharField(max_length=765) + url = models.CharField(max_length=384) + flags = models.CharField(max_length=51) + amount_def = models.DecimalField(max_digits=12, decimal_places=2) + amount_min = models.DecimalField(max_digits=12, decimal_places=2) + amount_max = models.DecimalField(max_digits=12, decimal_places=2) + mail = models.CharField(max_length=192) + confirmation = models.TextField() + asso = models.ForeignKey('Group', null=True, blank=True) + rib = models.ForeignKey(PaymentBankAccount) + class Meta: + db_table = u'payments' + + def __unicode__(self): + return u"%s: %s" % (self.id, self.text) + + +class PaymentCodeC(models.Model): + id = models.IntegerField(primary_key=True) + text = models.CharField(max_length=192) + class Meta: + db_table = u'payment_codeC' + + def __unicode__(self): + return self.text + + +class PaymentCodeRCB(models.Model): + id = models.IntegerField(primary_key=True) + text = models.CharField(max_length=192) + codec = models.IntegerField(db_column='codeC') # Field name made lowercase. + class Meta: + db_table = u'payment_codeRCB' + + def __unicode__(self): + return self.text + + +class PaymentMethod(models.Model): + id = models.IntegerField(primary_key=True) + text = models.CharField(max_length=96) + include = models.CharField(max_length=96) + short_name = models.CharField(max_length=30) + flags = models.CharField(max_length=36, blank=True) + class Meta: + db_table = u'payment_methods' + + def __unicode__(self): + return self.short_name + + +class PaymentReconcilation(models.Model): + #id = models.IntegerField(primary_key=True) + method = models.ForeignKey(PaymentMethod) + period_start = models.DateField() + period_end = models.DateField() + status = models.CharField(max_length=33) + payment_count = models.IntegerField() + sum_amounts = models.DecimalField(max_digits=11, decimal_places=2) + sum_commissions = models.DecimalField(max_digits=11, decimal_places=2) + comments = models.TextField() + recongroup_id = models.IntegerField(null=True, blank=True) + class Meta: + db_table = u'payment_reconcilations' + + def __unicode__(self): + return u"%s: %s" % (self.method, self.status) + + +class PaymentTransaction(models.Model): + id = models.CharField(max_length=192, primary_key=True) + method = models.ForeignKey(PaymentMethod, null=True, blank=True) + account = models.ForeignKey(Account, db_column='uid') + ref = models.IntegerField() + fullref = models.CharField(max_length=45) + ts_confirmed = models.DateTimeField(null=True, blank=True) + ts_initiated = models.DateTimeField(null=True, blank=True) + amount = models.DecimalField(max_digits=11, decimal_places=2) + commission = models.DecimalField(null=True, max_digits=11, decimal_places=2, blank=True) + pkey = models.CharField(max_length=15) + comment = models.CharField(max_length=765) + status = models.CharField(max_length=27) + recon = models.ForeignKey(PaymentReconcilation, null=True, blank=True) + display = models.IntegerField() + class Meta: + db_table = u'payment_transactions' + + def __unicode__(self): + return u"%s (%s)" % (self.fullref, self.ref) + + +class PaymentTransfer(models.Model): + #id = models.IntegerField(primary_key=True) + recongroup_id = models.IntegerField() + payment = models.ForeignKey(Payment) + amount = models.DecimalField(max_digits=11, decimal_places=2) + account = models.ForeignKey(Account, null=True, blank=True) + message = models.CharField(max_length=765) + date = models.DateField(null=True, blank=True) + class Meta: + db_table = u'payment_transfers' + + def __unicode__(self): + return u"%s: %s" % (self.id, self.amount) + + +# Groups +# ====== + + +class GroupDom(models.Model): + #id = models.IntegerField(primary_key=True) + name = models.TextField(db_column='nom') + cat = models.CharField(max_length=117) + class Meta: + db_table = u'group_dom' + + def __unicode__(self): + return u"%s :: %s" % (self.cat, self.name) + + +class Group(models.Model): + #id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=765, db_column='nom') + diminutif = models.CharField(max_length=192, unique=True) + cat = models.CharField(max_length=117) + dom = models.ForeignKey(GroupDom, null=True, db_column='dom', blank=True) + descr = models.TextField() + logo = models.TextField(blank=True) + logo_mime = models.TextField(blank=True) + site = models.CharField(max_length=765) + mail = models.CharField(max_length=765) + resp = models.CharField(max_length=765) + forum = models.CharField(max_length=765) + mail_domain = models.CharField(max_length=765) + ax = models.IntegerField() + pub = models.CharField(max_length=21) + sub_url = models.CharField(max_length=765) + inscriptible = models.IntegerField() + unsub_url = models.CharField(max_length=765) + flags = models.CharField(max_length=117) + axdate = models.DateField(null=True, db_column='axDate', blank=True) # Field name made lowercase. + welcome_msg = models.TextField(blank=True) + event_order = models.CharField(max_length=8) + disable_mails = models.BooleanField() + status = models.CharField(max_length=117) + class Meta: + db_table = u'groups' + + def __unicode__(self): + return self.name + + +# Group::membership +# ----------------- + + +class GroupMember(models.Model): + asso = models.ForeignKey(Group) + account = models.ForeignKey(Account, db_column='uid') + pkey = models.CompositeField(asso, account, primary_key=True) + + perms = models.CharField(max_length=18) + comm = models.CharField(max_length=765, blank=True) + position = models.CharField(max_length=54, blank=True) + flags = models.CharField(max_length=18) + class Meta: + db_table = u'group_members' + + def __unicode__(self): + return u"%s to %s" % (self.account.hruid, self.asso.name) + + +class GroupMemberSubRequest(models.Model): + asso = models.ForeignKey(Group) + account = models.ForeignKey(Account, db_column='uid') + pkey = models.CompositeField(asso, account, primary_key=True) + + ts = models.DateTimeField() + reason = models.TextField(blank=True) + class Meta: + db_table = u'group_member_sub_requests' + + def __unicode__(self): + return u"%s to %s" % (self.account.hruid, self.asso.name) + + +class GroupFormerMember(models.Model): + asso = models.ForeignKey(Group) + account = models.ForeignKey(Account, db_column='uid') + pkey = models.CompositeField(asso, account, primary_key=True) + + remember = models.IntegerField() + unsubsciption_date = models.DateField() + class Meta: + db_table = u'group_former_members' + + def __unicode__(self): + return u"%s to %s" % (self.account.hruid, self.asso.name) + + +# Group::Announces +# ---------------- + + +class GroupAnnounce(models.Model): + #id = models.IntegerField(primary_key=True) + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + asso = models.ForeignKey(Group) + create_date = models.DateTimeField() + titre = models.CharField(max_length=765) + texte = models.TextField() + contacts = models.TextField() + expiration = models.DateField() + promo_min = models.IntegerField() + promo_max = models.IntegerField() + flags = models.CharField(max_length=36) + post_id = models.IntegerField(null=True, blank=True, + help_text=u"NNTP post ID") + class Meta: + db_table = u'group_announces' + + def __unicode__(self): + return u"%s: %s" % (self.asso.name, self.titre) + + +class GroupAnnouncePhoto(models.Model): + eid = models.ForeignKey(GroupAnnounce, primary_key=True, db_column='eid') + attachmime = models.CharField(max_length=12) + attach = models.TextField() + x = models.IntegerField() + y = models.IntegerField() + class Meta: + db_table = u'group_announces_photo' + + def __unicode__(self): + return u"%s (%s, %d x %d)" % (self.eid, self.attachmime, self.x, self.y) + + +class GroupAnnounceRead(models.Model): + announce = models.ForeignKey(GroupAnnounce) + account = models.ForeignKey(Account, db_column='uid') + pkey = models.CompositeField(announce, account, primary_key=True) + class Meta: + db_table = u'group_announces_read' + + def __unicode__(self): + return u"%s: %s" % (self.account.hruid, self.announce_id) + + +# Group::Event +# ------------ + + +class GroupEvent(models.Model): + eid = models.IntegerField(primary_key=True) + asso = models.ForeignKey(Group, null=True, blank=True) + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + intitule = models.CharField(max_length=300) + short_name = models.CharField(max_length=90) + paiement = models.ForeignKey(Payment, null=True, blank=True) + descriptif = models.TextField() + debut = models.DateTimeField() + fin = models.DateTimeField(null=True, blank=True) + show_participants = models.BooleanField() + deadline_inscription = models.DateField(null=True, blank=True) + noinvite = models.IntegerField() + accept_nonmembre = models.BooleanField() + archive = models.BooleanField() + subscription_notification = models.CharField(max_length=24) + class Meta: + db_table = u'group_events' + + def __unicode__(self): + return u"%s: %s" % (self.asso.name, self.intitule) + + +class GroupEventItem(models.Model): + event = models.ForeignKey(GroupEvent, db_column='eid') + item_id = models.IntegerField() + pkey = models.CompositeField(event, item_id, primary_key=True) + + titre = models.CharField(max_length=300) + details = models.TextField() + montant = models.DecimalField(max_digits=12, decimal_places=2) + class Meta: + db_table = u'group_event_items' + + def __unicode__(self): + return u"%s - %s" % (self.event, self.item_id) + + +class GroupEventParticipant(models.Model): + event = models.ForeignKey(GroupEvent, db_column='eid') + item_id = models.IntegerField() + account = models.ForeignKey(Account, db_column='uid') + item = models.ForeignKey(GroupEventItem, to_field='pkey') + pkey = models.CompositeField(event, account, item, primary_key=True) + + nb = models.IntegerField() + flags = models.CharField(max_length=42) + paid = models.FloatField() + class Meta: + db_table = u'group_event_participants' + + def __unicode__(self): + return u"%s to %s" % (self.account.hruid, self.item) + + +# Group::misc +# ----------- + + +class GroupAuth(models.Model): + #id = models.IntegerField(primary_key=True) + privkey = models.CharField(max_length=120, unique=True) + name = models.CharField(max_length=96) + datafields = models.CharField(max_length=765) + returnurls = models.CharField(max_length=765) + last_used = models.DateField(null=True, blank=True) + group = models.ForeignKey(Group, null=True, blank=True) + flags = models.CharField(max_length=63, blank=True) + class Meta: + db_table = u'group_auth' + + def __unicode__(self): + return self.name + + +# Logging +# ======= + + +class IpWatch(models.Model): + state = models.CharField(max_length=27) + detection = models.DateField(null=True, blank=True) + last = models.DateTimeField() + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + description = models.TextField() + ip = models.IntegerField(primary_key=True) + mask = models.IntegerField() + class Meta: + db_table = u'ip_watch' + + def __unicode__(self): + return self.ip + + +class LogAction(models.Model): + #id = models.IntegerField(primary_key=True) + text = models.CharField(max_length=96) + description = models.CharField(max_length=765) + class Meta: + db_table = u'log_actions' + + def __unicode__(self): + return self.text + + +class LogSession(models.Model): + #id = models.IntegerField(primary_key=True) + auth = models.CharField(max_length=18) + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True, related_name='sessions') + start = models.DateTimeField() + host = models.CharField(max_length=384) + sauth = models.CharField(max_length=18) + suid = models.ForeignKey(Account, null=True, db_column='suid', blank=True, related_name='su_sessions') + browser = models.CharField(max_length=765) + forward_host = models.CharField(max_length=384, blank=True) + flags = models.CharField(max_length=15) + ip = models.IntegerField() + forward_ip = models.IntegerField(null=True, blank=True) + class Meta: + db_table = u'log_sessions' + + def __unicode__(self): + return u"%s: %s@%s" % (self.id, self.account.hruid, self.host) + + +class LogLastSession(models.Model): + account = models.ForeignKey(Account, primary_key=True, db_column='uid') + id = models.ForeignKey(LogSession, db_column='id') + class Meta: + db_table = u'log_last_sessions' + + def __unicode__(self): + return self.account.hruid + + +class LogEvent(models.Model): + stamp = models.DateTimeField(primary_key=True) + session = models.ForeignKey(LogSession, db_column='session') + action = models.ForeignKey(LogAction, db_column='action') + data = models.TextField(blank=True) + class Meta: + db_table = u'log_events' + + def __unicode__(self): + return u"%s@%s: %s" % (self.session_id, self.stamp, self.action.text) + + +# Newsletters +# =========== + + +class Newsletter(models.Model): + #id = models.IntegerField(primary_key=True) + group = models.ForeignKey(Group, unique=True) + name = models.CharField(max_length=765) + criteria = models.CharField(max_length=42, blank=True) + class Meta: + db_table = u'newsletters' + + def __unicode__(self): + return self.name + + +class NewsletterIssue(models.Model): + nlid = models.ForeignKey(Newsletter, unique=True, db_column='nlid') + #id = models.IntegerField(primary_key=True) + date = models.DateField() + send_before = models.DateTimeField(null=True, blank=True) + state = models.CharField(max_length=21) + sufb_json = models.TextField(blank=True) + title = models.CharField(max_length=765) + head = models.TextField() + signature = models.TextField() + short_name = models.CharField(max_length=48, unique=True, blank=True) + mail_title = models.CharField(max_length=765) + unsubscribe = models.IntegerField() + reply_to = models.CharField(max_length=765) + class Meta: + db_table = u'newsletter_issues' + + def __unicode__(self): + return self.title + + +class NewsletterCat(models.Model): + cid = models.AutoField(primary_key=True) + nlid = models.ForeignKey(Newsletter, db_column='nlid') + pos = models.IntegerField() + title = models.CharField(max_length=384) + class Meta: + db_table = u'newsletter_cat' + + def __unicode__(self): + return self.title + + +class NewsletterArt(models.Model): + issue = models.ForeignKey(NewsletterIssue, db_column='id') + aid = models.IntegerField() + pkey = models.CompositeField(issue, aid, primary_key=True) + cid = models.ForeignKey(NewsletterCat, null=True, db_column='cid', blank=True) + pos = models.IntegerField() + title = models.TextField() + body = models.TextField() + append = models.TextField() + class Meta: + db_table = u'newsletter_art' + + def __unicode__(self): + return u"%s: %s" % (self.issue_id, self.title) + + +class NewsletterIns(models.Model): + account = models.ForeignKey(Account, db_column='uid') + nl = models.ForeignKey(Newsletter, db_column='nlid') + pkey = models.CompositeField(account, nl, primary_key=True) + last = models.ForeignKey(NewsletterIssue, null=True, db_column='last', blank=True) + hash = models.CharField(max_length=96, blank=True) + class Meta: + db_table = u'newsletter_ins' + + def __unicode__(self): + return u"%s to %s" % (self.account.hruid, self.nl.title) + + +# Profile +# ======= + + +class ProfileDisplay(models.Model): + profile = models.OneToOneField(Profile, primary_key=True, db_column='pid') + yourself = models.CharField(max_length=765) + public_name = models.CharField(max_length=765) + private_name = models.CharField(max_length=765) + directory_name = models.CharField(max_length=765) + short_name = models.CharField(max_length=765) + sort_name = models.CharField(max_length=765) + promo = models.CharField(max_length=765) + class Meta: + db_table = u'profile_display' + + def __unicode__(self): + return self.profile.hrpid + + +class ProfilePhone(models.Model): + LINK_ADDRESS = 'address' + LINK_PRO = 'pro' + LINK_USER = 'user' + LINK_HQ = 'hq' + LINK_GROUP = 'group' + LINK_CHOICES = ( + (LINK_ADDRESS, u"Address"), + (LINK_PRO, u"Pro"), + (LINK_USER, u"User"), + (LINK_HQ, u"HQ"), + (LINK_GROUP, u"Group"), + ) + + KIND_FIXED = 'fixed' + KIND_MOBILE = 'mobile' + KIND_FAX = 'fax' + KIND_CHOICES = ( + (KIND_FIXED, u"Fixed"), + (KIND_MOBILE, u"Mobile"), + (KIND_FAX, u"Fax"), + ) + + profile = models.ForeignKey(Profile, db_column='pid', related_name='phones') + link_type = models.CharField(max_length=21, choices=LINK_CHOICES) + link_id = models.IntegerField() + tel_id = models.IntegerField() + pkey = models.CompositeField(profile, link_type, link_id, tel_id, primary_key=True) + + tel_type = models.CharField(max_length=18, choices=KIND_CHOICES) + search_tel = models.CharField(max_length=75) + display_tel = models.CharField(max_length=90) + pub = models.CharField(max_length=21) + comment = models.CharField(max_length=240) + + class Meta: + db_table = u'profile_phones' + + def __unicode__(self): + return u"%s: %s (%s)" % (self.profile.hrpid, self.display_tel, self.tel_type) + + @property + def is_address(self): + return self.link_type == self.LINK_ADDRESS + + @property + def is_job(self): + return self.link_type == self.LINK_PRO + + @property + def ax_visible(self): + return is_ax_visible(self.pub) + + +class ProfilePhoto(models.Model): + profile = models.OneToOneField(Profile, primary_key=True, db_column='pid', related_name='photo') + attachmime = models.CharField(max_length=12) + attach = models.TextField() + x = models.IntegerField() + y = models.IntegerField() + pub = models.CharField(max_length=21) + last_update = models.DateTimeField() + class Meta: + db_table = u'profile_photos' + + def __unicode__(self): + return self.profile.hrpid + + +class ProfilePrivateName(models.Model): + profile = models.ForeignKey(Profile, db_column='pid', related_name='private_name') + type = models.CharField(max_length=27) + id = models.IntegerField() + pkey = models.CompositeField(profile, type, id, primary_key=True) + name = models.CharField(max_length=765) + class Meta: + db_table = u'profile_private_names' + + def __unicode__(self): + return u"%s: %s" % (self.profile.hrpid, self.type) + + +class ProfilePublicName(models.Model): + profile = models.OneToOneField(Profile, primary_key=True, db_column='pid', related_name='public_name') + lastname_initial = models.CharField(max_length=765) + lastname_main = models.CharField(max_length=765) + lastname_marital = models.CharField(max_length=765) + lastname_ordinary = models.CharField(max_length=765) + firstname_initial = models.CharField(max_length=765) + firstname_main = models.CharField(max_length=765) + firstname_ordinary = models.CharField(max_length=765) + pseudonym = models.CharField(max_length=765) + class Meta: + db_table = u'profile_public_names' + + def __unicode__(self): + return self.profile.hrpid + + +# Profile::addresses +# ------------------ + + +class ProfileAddress(models.Model): + + KIND_HOME = 'home' + KIND_HQ = 'hq' + KIND_JOB = 'job' + KIND_GROUP = 'group' + + KIND_CHOICES = ( + (KIND_HOME, u"Home"), + (KIND_HQ, u"Headquarters"), + (KIND_JOB, u"Job"), + (KIND_GROUP, u"Group"), + ) + + profile = models.ForeignKey(Profile, db_column='pid', related_name='addresses') + job = models.ForeignKey('ProfileJobEnum', db_column='jobid', blank=True, null=True, + related_name='addresses') + #job = models.IntegerField(db_column='jobid') + group = models.ForeignKey('Group', db_column='groupid', blank=True, null=True) + #groupid = models.IntegerField() + addr_type = models.CharField(max_length=15, db_column='type', choices=KIND_CHOICES) + subid = models.IntegerField(db_column='id') + pkey = models.CompositeField(profile, job, group, addr_type, subid, primary_key=True) + pjob_key = models.CompositeField(profile, subid) + pjob = models.ForeignKey('ProfileJob', aux_field='pjob_key') + + flags = models.CharField(max_length=180, blank=True) + text = models.TextField() + postaltext = models.TextField(db_column='postalText') # Field name made lowercase. + formatted_address = models.TextField() + types = models.CharField(max_length=891) + latitude = models.FloatField(null=True, blank=True) + longitude = models.FloatField(null=True, blank=True) + southwest_latitude = models.FloatField(null=True, blank=True) + southwest_longitude = models.FloatField(null=True, blank=True) + northeast_latitude = models.FloatField(null=True, blank=True) + northeast_longitude = models.FloatField(null=True, blank=True) + location_type = models.CharField(max_length=54, blank=True) + partial_match = models.IntegerField() + pub = models.CharField(max_length=21) + comment = models.CharField(max_length=765, blank=True) + geocoding_date = models.DateField(null=True, blank=True) + geocoding_calls = models.IntegerField() + postal_code_fr = models.CharField(max_length=15, blank=True) + + components = models.ManyToManyField('ProfileAddressComponentEnum', + through='ProfileAddressComponent', related_name='addresses') + + class Meta: + db_table = u'profile_addresses' + + def __unicode__(self): + if self.addr_type == self.KIND_HOME: + rel = self.profile.hrpid + elif self.addr_type == self.KIND_HQ: + if self.jobid: + rel = unicode(self.job) + else: + rel = u"[BADJOB]" + elif self.addr_type == self.KIND_GROUP: + rel = unicode(self.group) + else: + rel = u"%s at %s" % (self.profile.hrpid, self.pjob.company) + return u"%s address %d for %s" % ( + self.get_addr_type_display(), self.subid, rel) + + @property + def ax_visible(self): + return is_ax_visible(self.pub) + + def get_components_by_type(self): + flags = collections.defaultdict(list) + for component in self.components.all(): + for cp_type in component.types.split(','): + flags[cp_type].append(component) + return flags + + @property + def flag_list(self): + return self.flags.split(',') + + FLAG_CURRENT = 'current' + FLAG_MAIL = 'mail' + FLAG_SECONDARY = 'secondary' + + @property + def current(self): + return self.FLAG_CURRENT in self.flag_list + + @property + def mail(self): + return self.FLAG_MAIL in self.flag_list + + @property + def secondary(self): + return self.FLAG_SECONDARY in self.flag_list + + @property + def is_home(self): + return self.addr_type == self.KIND_HOME + + @property + def is_job(self): + return self.addr_type == self.KIND_JOB + + +class ProfileAddressComponentEnum(models.Model): + #id = models.BigIntegerField(primary_key=True) + short_name = models.CharField(max_length=765) + long_name = models.CharField(max_length=765) + types = models.CharField(max_length=891) + class Meta: + db_table = u'profile_addresses_components_enum' + + def __unicode__(self): + return u'%s (%s)' % (self.short_name, self.types) + + +class ProfileAddressComponent(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + job = models.ForeignKey('ProfileJobEnum', db_column='jobid') + group = models.ForeignKey(Group, db_column='groupid', blank=True, null=True) + addr_type = models.CharField(max_length=15, db_column='type') + subid = models.IntegerField(db_column='id') + pkey = models.CompositeField(profile, job, group, addr_type, subid, primary_key=True) + + component = models.ForeignKey(ProfileAddressComponentEnum, related_name='component_links') + address = models.ForeignKey(ProfileAddress, related_name='component_links', + aux_field='pkey') + class Meta: + db_table = u'profile_addresses_components' + + def __unicode__(self): + return u"%s (%s) for %s" % ( + self.component.long_name, + self.component.types, + self.address, + ) + + +# Profile::networking +# ------------------- + + +class ProfileBinetEnum(models.Model): + #id = models.IntegerField(primary_key=True) + text = models.CharField(max_length=150) + url = models.CharField(max_length=765) + class Meta: + db_table = u'profile_binet_enum' + + +class ProfileBinet(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + binet = models.ForeignKey(ProfileBinetEnum) + pkey = models.CompositeField(profile, binet, primary_key=True) + class Meta: + db_table = u'profile_binets' + + +class ProfileHobby(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + id = models.IntegerField() + pkey = models.CompositeField(profile, id, primary_key=True) + type = models.CharField(max_length=18) + text = models.CharField(max_length=765) + pub = models.CharField(max_length=21) + class Meta: + db_table = u'profile_hobby' + + +class ProfileNetworkingEnum(models.Model): + nwid = models.IntegerField(primary_key=True) + name = models.CharField(max_length=90) + icon = models.CharField(max_length=150) + filter = models.CharField(max_length=18) + network_type = models.CharField(max_length=18) + link = models.CharField(max_length=765) + class Meta: + db_table = u'profile_networking_enum' + + +class ProfileNetworking(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + id = models.IntegerField() + nwid = models.ForeignKey(ProfileNetworkingEnum, db_column='nwid') + pkey = models.CompositeField(id, nwid, primary_key=True) + address = models.CharField(max_length=765) + pub = models.CharField(max_length=21) + class Meta: + db_table = u'profile_networking' + + +# Profile::corps +# -------------- + + +class ProfileCorpsEnum(models.Model): + #id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=255, unique=True) + abbreviation = models.CharField(max_length=15, unique=True) + still_exists = models.IntegerField() + class Meta: + db_table = u'profile_corps_enum' + + def __unicode__(self): + return self.name + + +class ProfileCorpsRankEnum(models.Model): + #id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=255, unique=True) + abbreviation = models.CharField(max_length=15, unique=True) + class Meta: + db_table = u'profile_corps_rank_enum' + + def __unicode__(self): + return self.name + + +class ProfileCorps(models.Model): + profile = models.OneToOneField(Profile, primary_key=True, db_column='pid') + original = models.ForeignKey(ProfileCorpsEnum, db_column='original_corpsid', related_name='original_members') + current = models.ForeignKey(ProfileCorpsEnum, db_column='current_corpsid', related_name='current_members') + rank = models.ForeignKey(ProfileCorpsRankEnum, db_column='rankid') + # Ignored: corps is public information anyway. + corps_pub = models.CharField(max_length=21) + class Meta: + db_table = u'profile_corps' + + def __unicode__(self): + return u"%s: %s" % (self.profile.hrpid, self.current.name) + + +# Profile::edu +# ------------ + + +class ProfileEducationEnum(models.Model): + #id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=255, unique=True, blank=True) + abbreviation = models.CharField(max_length=765) + url = models.CharField(max_length=765, blank=True) + country = models.ForeignKey(GeolocCountry, null=True, db_column='country', blank=True) + class Meta: + db_table = u'profile_education_enum' + + def __unicode__(self): + return self.name + + @property + def short(self): + return self.abbreviation or self.name + + +class ProfileEducationDegreeEnum(models.Model): + #id = models.IntegerField(primary_key=True) + degree = models.CharField(max_length=255, unique=True, blank=True) + abbreviation = models.CharField(max_length=765) + level = models.IntegerField() + class Meta: + db_table = u'profile_education_degree_enum' + + def __unicode__(self): + return self.degree + + +class ProfileEducationFieldEnum(models.Model): + #id = models.IntegerField(primary_key=True) + field = models.CharField(max_length=255, unique=True, blank=True) + class Meta: + db_table = u'profile_education_field_enum' + + def __unicode__(self): + return self.field + + +class ProfileEducation(models.Model): + id = models.IntegerField() + profile = models.ForeignKey(Profile, db_column='pid', related_name='educations') + pkey = models.CompositeField(id, profile, primary_key=True) + + school = models.ForeignKey(ProfileEducationEnum, null=True, db_column='eduid', blank=True) + degree = models.ForeignKey(ProfileEducationDegreeEnum, null=True, db_column='degreeid', blank=True) + field = models.ForeignKey(ProfileEducationFieldEnum, null=True, db_column='fieldid', blank=True) + entry_year = models.IntegerField(null=True, blank=True) + grad_year = models.IntegerField(null=True, blank=True) + promo_year = models.IntegerField(null=True, blank=True) + program = models.CharField(max_length=765, blank=True) + flags = models.CharField(max_length=81) + class Meta: + db_table = u'profile_education' + + def __unicode__(self): + return u"%s: %s" % (self.profile.hrpid, self.edu.name) + + +class ProfileEducationDegree(models.Model): + edu = models.ForeignKey(ProfileEducationEnum, db_column='eduid') + degree = models.ForeignKey(ProfileEducationDegreeEnum, db_column='degreeid') + pkey = models.CompositeField(edu, degree, primary_key=True) + class Meta: + db_table = u'profile_education_degree' + + def __unicode__(self): + return u"%s - %s" % (self.edu, self.degree) + + +# Profile::jobs +# ------------- + + +class ProfileJobEnum(models.Model): + #id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=255, unique=True) + acronym = models.CharField(max_length=765, blank=True) + url = models.CharField(max_length=765, blank=True) + email = models.CharField(max_length=765, blank=True) + holding = models.ForeignKey('self', null=True, db_column='holdingid', blank=True) + naf_code = models.CharField(max_length=15, db_column='NAF_code', blank=True) # Field name made lowercase. + ax_code = models.BigIntegerField(null=True, db_column='AX_code', blank=True) # Field name made lowercase. + siren_code = models.CharField(max_length=9, null=True, db_column='SIREN_code', blank=True) # Field name made lowercase. + class Meta: + db_table = u'profile_job_enum' + + def __unicode__(self): + return self.name + + @property + def address(self): + if not hasattr(self, '_address'): + + self._address = None + for address in self.addresses.all(): + if address.addr_type == address.KIND_HQ: + self._address = address + break + return self._address + + +class ProfileJob(models.Model): + id = models.IntegerField() + profile = models.ForeignKey(Profile, db_column='pid', related_name='jobs') + pkey = models.CompositeField(profile, id, primary_key=True) + + company = models.ForeignKey(ProfileJobEnum, null=True, db_column='jobid', blank=True) + description = models.CharField(max_length=765) + url = models.CharField(max_length=765) + email = models.CharField(max_length=765) + pub = models.CharField(max_length=21) + email_pub = models.CharField(max_length=21) + entry_year = models.CharField(max_length=12, blank=True) + class Meta: + db_table = u'profile_job' + + @property + def ax_visible(self): + return is_ax_visible(self.pub) + + @property + def ax_visible_email(self): + return is_ax_visible(self.email_pub) + + def __unicode__(self): + return u"%s at %s" % (self.profile.hrpid, self.company.name if self.company else '') + + +# Profile::job::terms +# ------------------- + + +class ProfileJobTermEnum(models.Model): + jtid = models.AutoField(primary_key=True) + name = models.CharField(max_length=765) + full_name = models.CharField(max_length=765) + class Meta: + db_table = u'profile_job_term_enum' + + def __unicode__(self): + return self.name + + +class ProfileJobTermRelation(models.Model): + jtid_1 = models.ForeignKey(ProfileJobTermEnum, db_column='jtid_1', related_name='relations_from') + jtid_2 = models.ForeignKey(ProfileJobTermEnum, db_column='jtid_2', related_name='relations_to') + rel = models.CharField(max_length=24) + computed = models.CharField(max_length=24) + pkey = models.CompositeField(jtid_1, jtid_2, computed, primary_key=True) + class Meta: + db_table = u'profile_job_term_relation' + + def __unicode__(self): + return u"%s <-> %s" % (self.jtid_1.name, self.jtid_2.name) + + +class ProfileJobTermSearch(models.Model): + search = models.CharField(max_length=150) + job_term = models.ForeignKey(ProfileJobTermEnum, db_column='jtid') + pkey = models.CompositeField(search, job_term, primary_key=True) + class Meta: + db_table = u'profile_job_term_search' + + def __unicode__(self): + return u"%s => %s" % (self.search, self.job_term.name) + + +class ProfileJobTerm(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + company = models.ForeignKey(ProfileJobEnum, db_column='jid') + job = models.ForeignKey(ProfileJob, to_field='pkey') + job_term = models.ForeignKey(ProfileJobTermEnum, db_column='jtid') + computed = models.CharField(max_length=24) + pkey = models.CompositeField(profile, company, job_term, primary_key=True) + class Meta: + db_table = u'profile_job_term' + + def __unicode__(self): + return u"%s at %s: %s" % (self.profile.hrpid, self.company.name, self.job_term.name) + + +class ProfileJobEntrepriseTerm(models.Model): + job = models.ForeignKey(ProfileJobEnum, db_column='eid') + job_term = models.ForeignKey(ProfileJobTermEnum, db_column='jtid') + pkey = models.CompositeField(job, job_term, primary_key=True) + class Meta: + db_table = u'profile_job_entreprise_term' + + def __unicode__(self): + return u"%s: %s" % (self.job.name, self.job_term.name) + + +# Profile::skills +# --------------- + + +class ProfileLangSkillEnum(models.Model): + iso_639_2b = models.CharField(max_length=9, primary_key=True) + language = models.CharField(max_length=765) + language_en = models.CharField(max_length=765) + iso_639_2t = models.CharField(max_length=9) + iso_639_1 = models.CharField(max_length=6, blank=True) + class Meta: + db_table = u'profile_langskill_enum' + + def __unicode__(self): + return self.iso_639_2b + + +class ProfileLangSkill(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + lang = models.ForeignKey(ProfileLangSkillEnum, db_column='lid') + pkey = models.CompositeField(profile, lang, primary_key=True) + level = models.IntegerField(null=True, blank=True) + class Meta: + db_table = u'profile_langskills' + + def __unicode__(self): + return u"%s: %s" % (self.profile.hrpid, self.lang.iso_639_2b) + + +class ProfileSkillEnum(models.Model): + id = models.CharField(max_length=9, primary_key=True) + text_fr = models.CharField(max_length=330) + text_en = models.CharField(max_length=330) + flags = models.CharField(max_length=15) + axfreetext = models.TextField() + class Meta: + db_table = u'profile_skill_enum' + + def __unicode__(self): + return self.text_en + + +class ProfileSkill(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + skill = models.ForeignKey(ProfileSkillEnum, db_column='cid') + pkey = models.CompositeField(profile, skill, primary_key=True) + level = models.CharField(max_length=54) + class Meta: + db_table = u'profile_skills' + + def __unicode__(self): + return u"%s: %s" % (self.profile.hrpid, self.skill.text_en) + + +# Profile::medals +# --------------- + + +class ProfileMedalEnum(models.Model): + #id = models.IntegerField(primary_key=True) + type = models.CharField(max_length=30) + text = models.CharField(max_length=765, blank=True) + img = models.CharField(max_length=765, blank=True) + flags = models.CharField(max_length=63) + class Meta: + db_table = u'profile_medal_enum' + + +class ProfileMedalGradeEnum(models.Model): + medal = models.ForeignKey(ProfileMedalEnum, db_column='mid') + gid = models.IntegerField() + pkey = models.CompositeField(medal, gid, primary_key=True) + text = models.CharField(max_length=765, blank=True) + pos = models.IntegerField() + class Meta: + db_table = u'profile_medal_grade_enum' + + +class ProfileMedal(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + medal = models.ForeignKey(ProfileMedalEnum) + gid = models.IntegerField() + grade = models.ForeignKey(ProfileMedalGradeEnum, to_field='pkey') + pkey = models.CompositeField(profile, medal, gid, primary_key=True) + level = models.CharField(max_length=18) + class Meta: + db_table = u'profile_medals' + + +# Profile::mentor +# --------------- + + +class ProfileMentor(models.Model): + profile = models.OneToOneField(Profile, primary_key=True, db_column='pid') + expertise = models.TextField() + class Meta: + db_table = u'profile_mentor' + + +class ProfileMentorCountry(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + country = models.ForeignKey(GeolocCountry, db_column='country') + pkey = models.CompositeField(profile, country, primary_key=True) + class Meta: + db_table = u'profile_mentor_country' + + +class ProfileMentorTerm(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + job_term = models.ForeignKey(ProfileJobTermEnum, db_column='jtid') + pkey = models.CompositeField(profile, job_term, primary_key=True) + class Meta: + db_table = u'profile_mentor_term' + + +# Profile::partner +# ---------------- + + +class ProfilePartnersharingEnum(models.Model): + #id = models.IntegerField(primary_key=True) + api_account = models.ForeignKey(Account, null=True, db_column='api_uid', blank=True) + shortname = models.CharField(max_length=192) + name = models.CharField(max_length=765) + url = models.CharField(max_length=765) + default_sharing_level = models.CharField(max_length=21, blank=True) + has_directory = models.IntegerField() + has_bulkmail = models.IntegerField() + class Meta: + db_table = u'profile_partnersharing_enum' + + +class ProfilePartnersharingSetting(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + partner = models.ForeignKey(ProfilePartnersharingEnum) + pkey = models.CompositeField(profile, partner, primary_key=True) + exposed_uid = models.CharField(max_length=765) + sharing_level = models.CharField(max_length=21, blank=True) + allow_email = models.CharField(max_length=18, blank=True) + last_connection = models.DateTimeField(null=True, blank=True) + class Meta: + db_table = u'profile_partnersharing_settings' + + +class ProfilePhotoToken(models.Model): + profile = models.ForeignKey(Profile, primary_key=True, db_column='pid') + token = models.CharField(max_length=765) + expires = models.DateTimeField() + class Meta: + db_table = u'profile_photo_tokens' + + +# Profile::misc +# ------------- + + +class ProfileMergeIssue(models.Model): + profile = models.ForeignKey(Profile, primary_key=True, db_column='pid') + issues = models.CharField(max_length=144, blank=True) + entry_year_ax = models.IntegerField(null=True, blank=True) + deathdate_ax = models.DateField(null=True, blank=True) + name = models.CharField(max_length=765, blank=True) + name_type = models.IntegerField(null=True, blank=True) + class Meta: + db_table = u'profile_merge_issues' + + +class ProfileModification(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + account = models.ForeignKey(Account, db_column='uid') + field = models.CharField(max_length=180) + pkey = models.CompositeField(profile, field, primary_key=True) + oldtext = models.TextField(db_column='oldText') + newtext = models.TextField(db_column='newText') + type = models.CharField(max_length=33) + timestamp = models.DateTimeField() + class Meta: + db_table = u'profile_modifications' + + +class ProfileVisibilityEnum(models.Model): + access_level = models.CharField(max_length=21, blank=True, primary_key=True) + best_display_level = models.CharField(max_length=21, blank=True) + display_levels = models.CharField(max_length=72, blank=True) + class Meta: + db_table = u'profile_visibility_enum' + + + +class ProfileDeltaten(models.Model): + profile = models.OneToOneField(Profile, primary_key=True, db_column='pid') + message = models.TextField() + class Meta: + db_table = u'profile_deltaten' + + +# Reminders +# ========= + + +class ReminderType(models.Model): + #type_id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=255, unique=True) + weight = models.IntegerField() + remind_delay_yes = models.IntegerField() + remind_delay_no = models.IntegerField() + remind_delay_dismiss = models.IntegerField() + class Meta: + db_table = u'reminder_type' + + +class Reminder(models.Model): + account = models.ForeignKey(Account, db_column='uid') + type = models.ForeignKey(ReminderType) + pkey = models.CompositeField(account, type, primary_key=True) + status = models.CharField(max_length=21) + remind_last = models.DateTimeField() + remind_next = models.DateTimeField(null=True, blank=True) + class Meta: + db_table = u'reminder' + + +class ReminderTip(models.Model): + #id = models.IntegerField(primary_key=True) + title = models.CharField(max_length=192) + text = models.TextField() + priority = models.IntegerField() + expiration = models.DateField() + promo_min = models.IntegerField() + promo_max = models.IntegerField() + state = models.CharField(max_length=18) + class Meta: + db_table = u'reminder_tips' + + +# Surveys +# ======= + + +class Survey(models.Model): + #id = models.IntegerField(primary_key=True) + questions = models.TextField() + title = models.CharField(max_length=765) + description = models.TextField() + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + end = models.DateField() + mode = models.IntegerField() + promos = models.CharField(max_length=765) + class Meta: + db_table = u'surveys' + + +class SurveyVote(models.Model): + #id = models.IntegerField(primary_key=True) + survey = models.ForeignKey(Survey) + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + class Meta: + db_table = u'survey_votes' + + +class SurveyAnswer(models.Model): + #id = models.IntegerField(primary_key=True) + vote = models.ForeignKey(SurveyVote) + question_id = models.IntegerField() + answer = models.TextField() + class Meta: + db_table = u'survey_answers' + + +# GApps +# ===== + + +class GappsAccount(models.Model): + l_userid = models.ForeignKey(Account, null=True, db_column='l_userid', blank=True) + l_sync_password = models.BooleanField(default=True) + l_activate_mail_redirection = models.BooleanField(default=True) + g_account_id = models.CharField(max_length=48, blank=True) + g_account_name = models.CharField(max_length=255, primary_key=True) + g_domain = models.CharField(max_length=120, blank=True) + g_first_name = models.CharField(max_length=120) + g_last_name = models.CharField(max_length=120) + g_status = models.CharField(max_length=39, blank=True) + g_admin = models.BooleanField() + g_suspension = models.CharField(max_length=768, blank=True) + r_disk_usage = models.BigIntegerField(null=True, blank=True) + r_creation = models.DateField(null=True, blank=True) + r_last_login = models.DateField(null=True, blank=True) + r_last_webmail = models.DateField(null=True, blank=True) + class Meta: + db_table = u'gapps_accounts' + + +class GappsNickname(models.Model): + l_userid = models.ForeignKey(Account, null=True, db_column='l_userid', blank=True) + g_account_name = models.CharField(max_length=768) + g_nickname = models.CharField(max_length=255, primary_key=True) + class Meta: + db_table = u'gapps_nicknames' + + +class GappsQueue(models.Model): + q_id = models.AutoField(primary_key=True) + q_owner = models.ForeignKey(Account, null=True, blank=True, related_name='owned_gapps_jobs') + q_recipient = models.ForeignKey(Account, null=True, blank=True, related_name='received_gapps_jobs') + p_entry_date = models.DateTimeField() + p_notbefore_date = models.DateTimeField() + p_start_date = models.DateTimeField(null=True, blank=True) + p_end_date = models.DateTimeField(null=True, blank=True) + p_status = models.CharField(max_length=24) + p_priority = models.CharField(max_length=27) + p_admin_request = models.BooleanField() + j_type = models.CharField(max_length=30) + j_parameters = models.TextField(blank=True) + r_softfail_date = models.DateTimeField(null=True, blank=True) + r_softfail_count = models.IntegerField() + r_result = models.CharField(max_length=768, blank=True) + class Meta: + db_table = u'gapps_queue' + + +class GappsReporting(models.Model): + date = models.DateField(primary_key=True) + num_accounts = models.IntegerField(null=True, blank=True) + count_1_day_actives = models.IntegerField(null=True, blank=True) + count_7_day_actives = models.IntegerField(null=True, blank=True) + count_14_day_actives = models.IntegerField(null=True, blank=True) + count_30_day_actives = models.IntegerField(null=True, blank=True) + count_30_day_idle = models.IntegerField(null=True, blank=True) + count_60_day_idle = models.IntegerField(null=True, blank=True) + count_90_day_idle = models.IntegerField(null=True, blank=True) + usage_in_bytes = models.BigIntegerField(null=True, blank=True) + quota_in_mb = models.IntegerField(null=True, blank=True) + class Meta: + db_table = u'gapps_reporting' + + + +# Watch +# ===== + + +class Watch(models.Model): + account = models.ForeignKey(Account, primary_key=True, db_column='uid') + flags = models.CharField(max_length=39) + actions = models.CharField(max_length=105) + last = models.DateTimeField() + class Meta: + db_table = u'watch' + + +class WatchGroup(models.Model): + account = models.ForeignKey(Account, db_column='uid') + group = models.ForeignKey(Group, db_column='groupid') + pkey = models.CompositeField(account, group, primary_key=True) + class Meta: + db_table = u'watch_group' + + +class WatchNonins(models.Model): + account = models.ForeignKey(Account, db_column='uid', related_name='watching') + watched = models.ForeignKey(Account, db_column='ni', related_name='watched_by') + pkey = models.CompositeField(account, watched, primary_key=True) + class Meta: + db_table = u'watch_nonins' + + +class WatchProfile(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + ts = models.DateTimeField() + field = models.CharField(max_length=36) + pkey = models.CompositeField(profile, field, primary_key=True) + class Meta: + db_table = u'watch_profile' + + +class WatchPromo(models.Model): + account = models.ForeignKey(Account, db_column='uid') + promo = models.IntegerField() + pkey = models.CompositeField(account, promo, primary_key=True) + class Meta: + db_table = u'watch_promo' + + +# Postfix +# ======= + + +class MxWatch(models.Model): + host = models.CharField(max_length=192, primary_key=True) + state = models.CharField(max_length=21, blank=True) + text = models.TextField() + class Meta: + db_table = u'mx_watch' + + +class PostfixBlacklist(models.Model): + email = models.CharField(max_length=255, primary_key=True) + reject_text = models.CharField(max_length=192) + class Meta: + db_table = u'postfix_blacklist' + + +class PostfixMailseen(models.Model): + crc = models.CharField(max_length=24, primary_key=True) + nb = models.IntegerField() + update_time = models.DateTimeField() + create_time = models.DateTimeField() + release = models.CharField(max_length=18) + class Meta: + db_table = u'postfix_mailseen' + + +class PostfixWhitelist(models.Model): + email = models.CharField(max_length=255, primary_key=True) + class Meta: + db_table = u'postfix_whitelist' + + +# Register +# ======== + + +class RegisterMarketing(models.Model): + account = models.ForeignKey(Account, db_column='uid', related_name='received_marketings') + sender = models.ForeignKey(Account, null=True, db_column='sender', blank=True, related_name='sent_marketings') + email = models.CharField(max_length=765) + pkey = models.CompositeField(account, email, primary_key=True) + + date = models.DateField() + last = models.DateField() + nb = models.IntegerField() + type = models.CharField(max_length=15, blank=True) + hash = models.CharField(max_length=96) + message = models.CharField(max_length=48) + message_data = models.CharField(max_length=192, blank=True) + personal_notes = models.TextField(blank=True) + class Meta: + db_table = u'register_marketing' + + +class RegisterMstat(models.Model): + account = models.OneToOneField(Account, primary_key=True, db_column='uid', related_name='received_marketings_stats') + sender = models.ForeignKey(Account, null=True, db_column='sender', blank=True, related_name='sent_marketings_stats') + success = models.DateField() + class Meta: + db_table = u'register_mstats' + + +class RegisterPending(models.Model): + account = models.OneToOneField(Account, primary_key=True, db_column='uid') + forlife = models.CharField(max_length=255, unique=True) + bestalias = models.CharField(max_length=255, unique=True) + mailorg2 = models.CharField(max_length=765, blank=True) + password = models.CharField(max_length=120) + email = models.CharField(max_length=765) + date = models.DateField() + relance = models.DateField() + naissance = models.DateField() + hash = models.CharField(max_length=36) + services = models.CharField(max_length=78) + class Meta: + db_table = u'register_pending' + + +class RegisterPendingXnet(models.Model): + account = models.ForeignKey(Account, primary_key=True, db_column='uid', related_name='pending_xnet_register') + hruid = models.ForeignKey(Account, unique=True, db_column='hruid', related_name='pending_xnet_register_by_hruid') + email = models.CharField(max_length=765) + date = models.DateField() + last_date = models.DateField(null=True, blank=True) + hash = models.CharField(max_length=36) + sender_name = models.CharField(max_length=765) + group_name = models.CharField(max_length=765) + class Meta: + db_table = u'register_pending_xnet' + + +class RegisterSubs(models.Model): + account = models.ForeignKey(Account, db_column='uid') + type = models.CharField(max_length=15) + sub = models.CharField(max_length=96) + domain = models.CharField(max_length=192) + pkey = models.CompositeField(account, type, sub, domain, primary_key=True) + class Meta: + db_table = u'register_subs' + + +# Search +# ====== + + +class SearchAutocomplete(models.Model): + name = models.CharField(max_length=60) + query = models.CharField(max_length=300) + pkey = models.CompositeField(name, query, primary_key=True) + result = models.TextField() + generated = models.DateTimeField() + class Meta: + db_table = u'search_autocomplete' + + +class SearchName(models.Model): + profile = models.ForeignKey(Profile, db_column='pid') + token = models.CharField(max_length=765) + pkey = models.CompositeField(profile, token, primary_key=True) + score = models.IntegerField() + soundex = models.CharField(max_length=12) + flags = models.CharField(max_length=18) + general_type = models.CharField(max_length=27) + class Meta: + db_table = u'search_name' + + +# Requests +# ======== + + +class Request(models.Model): + account = models.ForeignKey(Account, db_column='uid') + type = models.CharField(max_length=48) + data = models.TextField() + stamp = models.DateTimeField() + profile = models.ForeignKey(Profile, null=True, db_column='pid', blank=True) + pkey = models.CompositeField(account, stamp, type, primary_key=True) + class Meta: + db_table = u'requests' + + +class RequestAnswer(models.Model): + #id = models.IntegerField(primary_key=True) + category = models.CharField(max_length=45) + title = models.CharField(max_length=150) + answer = models.TextField() + class Meta: + db_table = u'requests_answers' + + +class RequestHidden(models.Model): + account = models.ForeignKey(Account, primary_key=True, db_column='uid') + hidden_requests = models.TextField() + class Meta: + db_table = u'requests_hidden' + + +# Misc +# ==== + + +class AXLetter(models.Model): + #id = models.IntegerField(primary_key=True) + short_name = models.CharField(max_length=48, unique=True, blank=True) + subject = models.CharField(max_length=765) + title = models.CharField(max_length=765) + body = models.TextField() + signature = models.TextField() + promo_min = models.IntegerField() + promo_max = models.IntegerField() + subset = models.TextField(blank=True) + subset_rm = models.IntegerField(null=True, blank=True) + echeance = models.DateTimeField() + date = models.DateField() + bits = models.CharField(max_length=48) + class Meta: + db_table = u'axletter' + + +class Carva(models.Model): + account = models.ForeignKey(Account, primary_key=True, db_column='uid') + url = models.CharField(max_length=765) + class Meta: + db_table = u'carvas' + + +class Contact(models.Model): + account = models.ForeignKey(Account, db_column='uid') + contact = models.ForeignKey(Profile, db_column='contact') + pkey = models.CompositeField(account, contact, primary_key=True) + class Meta: + db_table = u'contacts' + + +class Downtime(models.Model): + debut = models.DateTimeField() + duree = models.TimeField() # This field type is a guess. + resume = models.CharField(max_length=765) + description = models.TextField() + services = models.CharField(max_length=54) + class Meta: + db_table = u'downtimes' + + +class EmailListModerate(models.Model): + ml = models.CharField(max_length=192) + domain = models.CharField(max_length=192) + mid = models.IntegerField() + pkey = models.CompositeField(ml, domain, mid, primary_key=True) + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + action = models.CharField(max_length=18) + ts = models.DateTimeField() + message = models.TextField(blank=True) + handler = models.IntegerField(null=True, blank=True) + class Meta: + db_table = u'email_list_moderate' + + +class EmailSendSave(models.Model): + account = models.OneToOneField(Account, primary_key=True, db_column='uid') + data = models.TextField() + class Meta: + db_table = u'email_send_save' + + +class EmailWatch(models.Model): + email = models.CharField(max_length=180, primary_key=True) + state = models.CharField(max_length=27) + detection = models.DateField(null=True, blank=True) + last = models.DateTimeField() + account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + description = models.TextField() + class Meta: + db_table = u'email_watch' + + +class GeolocLanguage(models.Model): + iso_3166_1_a2 = models.ForeignKey(GeolocCountry, db_column='iso_3166_1_a2') + language = models.CharField(max_length=15) + pkey = models.CompositeField(iso_3166_1_a2, language, primary_key=True) + country = models.CharField(max_length=765, blank=True) + countryplain = models.CharField(max_length=765, db_column='countryPlain', blank=True) # Field name made lowercase. + class Meta: + db_table = u'geoloc_languages' + + +class HomonymList(models.Model): + hrmid = models.CharField(max_length=765) + account = models.ForeignKey(Account, db_column='uid') + pkey = models.CompositeField(hrmid, account, primary_key=True) + class Meta: + db_table = u'homonyms_list' + + +class UrlShortener(models.Model): + alias = models.CharField(max_length=255, primary_key=True) + url = models.TextField() + class Meta: + db_table = u'url_shortener' + -- 2.1.4