# -*- coding: utf8 -*-
from wtforms import Form, BooleanField, TextField, TextAreaField, SelectField
from wtforms import SubmitField, validators, FieldList, PasswordField
#import .ExtWforms
from .ExtWtforms import MySelectField
from wtforms import HiddenField, DecimalField, DateTimeField, FormField, DateField
from wtforms.validators import ValidationError
strip_filter = lambda x: x.strip() if x else None
from wtforms.csrf.session import SessionCSRF
from datetime import timedelta
from jm2l.const import CurrentYear

class MyBaseForm(Form):
    class Meta:
        csrf = True
        csrf_class = SessionCSRF
        csrf_secret = b'lJDQtOAMC2qe89doIn8u3Mch_DgeLSKO'
        csrf_time_limit = timedelta(minutes=60)

class BlogCreateForm(MyBaseForm):
    title = TextField('Entry title', [validators.Length(min=1, max=255)],
                      filters=[strip_filter])
    body = TextAreaField('Entry body', [validators.Length(min=1)],
                         filters=[strip_filter])

class BlogUpdateForm(BlogCreateForm):
    id = HiddenField()
    
    
PLACE_TYPE = [('Aeroport', u'Aéroport'), ('Gare','Gare'), ('JM2L','JM2L'),
              ('Hotel',u'Hôtel'), ('Habitant','Habitant'), 
              ('Restaurant','Restaurant'), ('Autres','Autres')]

TIERS_ROLE = [('Exposant','Exposant'), ('Sponsor','Sponsor'),
                ('Donateur','Donateur')]

YESNO = [("0","Non"), ("1","Oui")]

EVENT_TYPE = ['Stand', 'Table ronde', 'Atelier', 'Concert', 'Conference', 'Repas']

CONF_DURATION = [ (15,u'Lighting talk ( 5 min)'),
              (30,u'Conférence    (20 min)'),
              (60,u'Conférence    (50 min)'),
              (90,u'Conférence    (75 min)'),]
              
ATELIER_DURATION = [ (15,u'Lighting talk ( 5 min)'),
              (30,u'Conférence    (20 min)'),
              (60,u'Conférence    (50 min)'),
              (90,u'Conférence    (75 min)'),]


class StaffArea(MyBaseForm):
    name = TextField(u'Pôle')
    description = TextAreaField('Description', [validators.optional(), validators.Length(max=1000000)],
                        filters=[strip_filter]
                        )
    year_uid = HiddenField('year', default=str(CurrentYear))

class EditStaffArea(StaffArea):
    uid = HiddenField()

class StaffTasks(MyBaseForm):
    name     = TextField(u'Nom de la tâche', [validators.Required()])
    area_uid = SelectField(u'Pôle concerné', coerce=int )
    closed_by = SelectField(u'Assigné à', coerce=int )
    due_date = DateField(u'Date prévue', format='%d/%m/%Y')
    description = TextAreaField('Description', [validators.optional(), validators.Length(max=1000000)],
        filters=[strip_filter])
    year_uid = HiddenField('year', default=str(CurrentYear))

class EditStaffTasks(StaffTasks):
    uid = HiddenField()

class DossPresse(MyBaseForm):
    year_uid    = HiddenField()
    doss_presse = TextAreaField('Dossier de Presse', [validators.optional(), validators.Length(max=1000000)],
        filters=[strip_filter])

class IndexForm(MyBaseForm):
    year_uid    = HiddenField() 
    description = TextAreaField('Index', [validators.optional(), validators.Length(max=1000000)],
        filters=[strip_filter])

class TiersMember(MyBaseForm):
    class Meta:
        csrf = False

    year_uid = SelectField(u'Année', coerce=int, choices=zip(range(2006,CurrentYear+1),range(2006,CurrentYear+1)))
    user_uid = TextField(u'user')
    role = TextField(u'Role')

class TiersRole(MyBaseForm):
    class Meta:
        csrf = False

    year_uid = SelectField(u'Année', coerce=int, choices=zip(range(2006,CurrentYear+1),range(2006,CurrentYear+1)))
    tiers_role = SelectField(u'Role', choices=TIERS_ROLE)
    
class TiersChoice(MyBaseForm):
    class Meta:
        csrf = False

    year_uid = HiddenField()
    user_uid = HiddenField()
    tiers_uid = TextField(u'Entité')
    role = TextField(u'Role')

class AddIntervenant(MyBaseForm):
    class Meta:
        csrf = False
            
    event_uid = HiddenField()
    intervenant = SelectField(u'Intervenant', coerce=int )

class AddTiers(MyBaseForm):
    class Meta:
        csrf = False
            
    event_uid = HiddenField()
    tiers = SelectField(u'Entité', coerce=int )

class ConfCreateForm(MyBaseForm):

    event_type = HiddenField()
    for_year = HiddenField()
    start_time = HiddenField()
    end_time = HiddenField()

    start_sel = SelectField(u'Début', coerce=int,
            description=u"C'est une heure indicative correspondant au mieux à vos préférences "+
            u"personnelles. Vous pouvez prendre un créneau horaire déjà réservé si vous avez des contraintes "
            u"particulières. L'équipe des JM2L mettra à disposition plus de salle si nécessaire. En cas de conflit,"+
            u"l'organisation se réserve le droit de changer la salle et l'heure avec votre accord."
    )
    duration =  SelectField(u'Durée', coerce=int,
            description=u"Précisez ici la durée de votre intervention"
    )

    salle_uid = SelectField(u'Salle', coerce=int, 
            description=u"Choisissez ici la salle en fonction "
            u"du nombres de personnes potentiellement intéressé par votre intervention "+
            u"l'organisation se réserve le droit de changer la salle (avec votre accord)."
    
    )

    name = TextField(u'Le nom de votre ', 
            [validators.DataRequired(u'Vous devez spécifier un nom pour votre intérvention'),
            validators.Length(min=1, max=80, message='entre 1 et 80 car')],
                        filters=[strip_filter])
    
    description = TextAreaField(u'Décrivez ici quelques détails à propos de votre intervention ', 
            [validators.Optional(), validators.Length(max=1000000)],
                        filters=[strip_filter]                        
                )

class ConfUpdateForm(ConfCreateForm):
    uid = HiddenField()

class SalleForm(MyBaseForm):
    year_uid      = SelectField(u'Année', coerce=int)
    phy_salle_id  = SelectField('Salle Physique', coerce=int)
    place_type    = SelectField('Type', choices=[('Conference',u'Conférence'),
                        ('Stand','Stand'), ('Atelier','Atelier'), ('Table ronde','Table ronde'), 
                        ('MAO','MAO'), ('Repas','Repas / Snack'), ('Autres','Autres') ])
    name          = TextField('Nom de la salle', [validators.Length(min=1, max=40)],
                        filters=[strip_filter])
    description   = TextAreaField('Description',
                         filters=[strip_filter])  

class EditSalleForm(SalleForm):
    salle_id      = HiddenField()

class SallePhyForm(MyBaseForm):
    name          = TextField('Nom de la salle', [validators.Length(min=1, max=40)],
                        filters=[strip_filter])
    nb_places     = TextField('Nombre de places', [validators.Length(max=4)])
    description   = TextAreaField('Description',
                         filters=[strip_filter])  

class EditSallePhyForm(SallePhyForm):
    uid      = HiddenField()

class PlaceCreateForm(MyBaseForm):

    place_type = SelectField('Type', choices=PLACE_TYPE)
    
    display_name = TextField(u'Nom affiché', [validators.Length(min=1, max=20)],
                        filters=[strip_filter])
    name = TextField('Nom Complet', [validators.Length(min=1, max=80)],
                        filters=[strip_filter])
    gps_coord = TextField(u'Coordonnées GPS', [validators.Length(max=30)],
                        filters=[strip_filter])
    adresse = TextAreaField('Adresse', [validators.Length(max=100)],
                        filters=[strip_filter])
    codePostal = TextField('Code Postal', [validators.Length(max=5)],
                        filters=[strip_filter])
    ville = TextField('Ville', [validators.Length(max=40)],
                        filters=[strip_filter])
    website = TextField('Site Web', [validators.Length(max=100)],
                        filters=[strip_filter])
    description = TextAreaField('Description',
                         filters=[strip_filter])
                         
    created_by = HiddenField()
                         
class PlaceUpdateForm(PlaceCreateForm):
    place_id = HiddenField()


def captcha_check(form, field):
    if form.meta.csrf_context.get('Captcha')!=field.data:
        raise ValidationError(u"la vérification captcha est invalide.")

class UserPasswordForm(MyBaseForm):
    uid = HiddenField()
    password = PasswordField("Mot de passe",[
            validators.Length(max=128, message=u"128 car. maximum"),
            validators.required(message=u"Ce champ est obligatoire"),
            validators.EqualTo('confirm', message=u'Les password ne sont pas équivalents') ],
                        filters=[strip_filter]
        )
    confirm  = PasswordField('Confirmez')
class UserRegisterForm(MyBaseForm):
                        
    nom = TextField(u'Nom', [
            validators.Length(max=80, message=u"80 car. maximum"),
            validators.required(message=u"Ce champ est obligatoire") ],
                        filters=[strip_filter]
                        )
    prenom = TextField(u'Prénom', [
            validators.Length(max=80, message=u"80 car. maximum"),
            validators.required(message=u"Ce champ est obligatoire"), 
            validators.Length(max=80)], filters=[strip_filter]
                        )
    mail = TextField(u'Adresse électronique', [
            validators.required(message=u"Ce champ est obligatoire"), 
            validators.Email(message=u"Essayez aussi avec une adresse e-mail valide"),
            validators.Length(max=100)],
                        filters=[strip_filter],    
                        description = u"Une adresse e-mail valide." +
                            u"Cette adresse ne sera pas rendue publique, "+
                            u"et ne sera pas divulguée à des tiers."
                        )
    captcha = TextField(u'Captcha', [validators.Length(max=8), captcha_check],
                        filters=[strip_filter]
                        )
    
class ProfilForm(MyBaseForm):
    id = HiddenField()
    user_id = HiddenField()
    nom = TextField(u'Nom', [validators.Length(max=80)],
                        filters=[strip_filter],
                        description = u"Les espaces sont autorisés, la ponctuation n'est " +
                        u"pas autorisée à l'exception des points, traits d'union, " +
                        u"apostrophes et tirets bas."
                        )
    prenom = TextField(u'Prénom', [validators.Length(max=80)],
                        filters=[strip_filter],
                        description = u"Les espaces sont autorisés, la ponctuation n'est " +
                        u"pas autorisée à l'exception des points, traits d'union, " +
                        u"apostrophes et tirets bas."
                        )
    pseudo = TextField(u'Pseudo', [validators.Length(max=80)],
                        filters=[strip_filter],
                        description = "Votre pseudo d'usage sur la toile."
                        )
    mail = TextField(u'Adresse électronique', [validators.optional(), validators.Email(), validators.Length(max=100)],
                        filters=[strip_filter],    
                        description = u"Une adresse e-mail valide. Tous les messages de ce système" +
        u"seront envoyés à cette adresse. Cette adresse ne sera pas rendue publique,"+
        u"et ne sera utilisée que si vous désirez obtenir un nouveau mot de passe ou" +
        u"recevoir personnellement certaines nouvelles ou avertissements."
                        )
    
    phone = TextField(u'Mobile', [validators.optional(), validators.Length(max=10), 
                        validators.Regexp("\d+", message=u"Le numéro de téléphone mobile ne doit contenir que des chiffres")],
                        filters=[strip_filter],  
                        description = u"Un numéro de mobile valide. Afin de pouvoir rester en" +
        u"contact avec les personne de l'organisation, et pour vos échanges. " +
        u"Ce numéro ne sera pas publié, et ne sera utilisé que si " +
        u"vous désirez recevoir personnellement certaines nouvelles ou alertes."
                        )
                        
    website = TextField(u'Site web', [validators.optional(), validators.URL(), validators.Length(max=100)],
                        filters=[strip_filter],    
                        description = "Renseignez ici votre site Web."
                        )

    gpg_key = TextAreaField(u'Ma clé GPG', 
                        [validators.optional(), validators.Length(max=9000)],
                        filters=[strip_filter], 
                        description = u"Vous pouvez insérer votre clé GPG publique pour " +
                        u"échanger des données sécurisées."
                        )
    soc_link = TextAreaField('Mes autres identifiants', 
                        [validators.optional(), validators.Length(max=1000000)],
                        filters=[strip_filter], 
                        description = u"Vous pouvez insérer ici d'autres identifiants " +
        u"permettant aux autres de vous retrouver sur la toile (IRC, jabber, réseaux sociaux etc)."
                        )

    bio = TextAreaField('Biographie', [validators.optional(), validators.Length(max=1000000)],
                        filters=[strip_filter]
                        )
                        
    tiersship = FieldList(FormField(TiersChoice))                        


class MiamForm(MyBaseForm):
    RepasVendredi = SelectField(u'Je viens au dîner convivial vendredi soir',
                        choices=YESNO,
                        description = u"L'organisation réserve le " +
                        u"restaurant pour ce dîner convivial. De petites " +
                        u"animations vous seront proposées. " +
                        u"Il nous faut savoir si on vous réserve une place !"
                    )

    RepasSamediMidi = SelectField(u'Je déjeune sur place samedi midi', choices=YESNO )

    RepasSamediSoir   = SelectField(u'Je viens au repas de clôture samedi soir', choices=YESNO,
                    description = u"L'organisation réserve le " +
                        u"restaurant pour le dîner de clôture. De petites " +
                        u"animations vous seront proposées. " +
                        u"Il nous faut savoir si on vous réserve une place !"
                    )

    Allergies     = TextAreaField(u'Allergies', [validators.Length(max=100)],
                        filters=[strip_filter],
                        description = u"Entrez ici vos allergies éventuelles, " +
                        u"Ce que votre organisme ne supporte absolument pas." +
                        u"L'organisation fera alors en sorte de les éviter ou " +
                        u"de les identifier explicitement."
                    )
    Contraintes   = TextAreaField(u'Contraintes', [validators.Length(max=100)],
                        filters=[strip_filter],
                        description = u"Entrez ici ce que vous n'aimez pas, " +
                        u"Cela ne consititue pas pour vous un allérgène, " +
                        u"mais vous n'aimez simplement pas. (Gluten / Laitage etc ...)"
                    )


class DateStartConfidenceForm(MyBaseForm):
    ConfidenceLevel = [
        ("0",u"exactement à"),
        ("1",u"approximativement à"),
        ("2",u"à peu près (5 à 15 min) vers"),
        ("3",u"à une vache près (1h) vers")
    ]
    DayChoice     = [("4","Jeudi"), ("5","Vendredi"), ("6","Samedi"), ("0","Dimanche"), ("1","Lundi")]
    Day           = SelectField(u'Jour', choices=DayChoice )
    Confidence    = SelectField(u'Confiance', choices=ConfidenceLevel)
    Hour          = TextField(u'Heure', [validators.Length(max=5,
                        message=u"doit faire au maximum 5 caractères"),
                      validators.Regexp("\d+:\d+", 
                        message=u"doit être sous la forme HH:MM")],
                        filters=[strip_filter])
    start_time    = HiddenField()
                    
class ItineraireForm(Form):
    start_place   = SelectField(u'En partant de', coerce=int)
    arrival_place = SelectField(u'et à destination de', coerce=int)
    itin_id       = HiddenField()     
    
class AddItineraireForm(Form):

    itin          = FormField(ItineraireForm)
    distance      = DecimalField(u'Distance', [validators.Length(min=1, max=4)],
                        filters=[strip_filter])
    duration      = DateTimeField(u'Durée', [validators.Length(min=4, max=5)],
                        filters=[strip_filter])
    price         = DecimalField(u'Prix approx.', [validators.Length(min=1, max=5)],
                        filters=[strip_filter])
    tr_pied       = BooleanField(u'à pied')
    tr_velo       = BooleanField(u'à vélo')
    tr_moto       = BooleanField(u'à moto')    
    tr_voiture    = BooleanField(u'en voiture')
    tr_taxi       = BooleanField(u'en taxi')
    tr_bus        = BooleanField(u'en bus')    
    tr_avion      = BooleanField(u'en avion')
    description   = TextAreaField(u'Description de l\'itinéraire')

class AddMember(MyBaseForm):
    tiers_uid = HiddenField()
    nom = TextField(u'Nom', [validators.Length(max=80)],
                        filters=[strip_filter],
                        description = u"Les espaces sont autorisés, la ponctuation n'est " +
                        u"pas autorisée à l'exception des points, traits d'union, " +
                        u"apostrophes et tirets bas."
                        )
    prenom = TextField(u'Prénom', [validators.Length(max=80)],
                        filters=[strip_filter],
                        description = u"Les espaces sont autorisés, la ponctuation n'est " +
                        u"pas autorisée à l'exception des points, traits d'union, " +
                        u"apostrophes et tirets bas."
                        )
    email = TextField(u'Email', [validators.required(), 
                validators.length(max=10), 
                validators.Email(message='Ceci ne ressemble pas à une adresse valide')],
                description=u"Afin d'éviter la duplication d'information et les doublons inutile, "+
                    u"pensez d'abord à lui demander de confirmer le mail qu'il a utilisé lors de "+
                    u"son inscription sur le site.")
    add = SubmitField('Ajouter des membres')

class TiersForm(MyBaseForm):
    name = TextField(u'Nom', [validators.Length(max=100)],
                        filters=[strip_filter],
                        description = u"Les espaces sont autorisés, la ponctuation n'est " +
                        u"pas autorisée à l'exception des points, traits d'union, " +
                        u"apostrophes et tirets bas."
                        )

    tiers_type = MySelectField('Nature', coerce=int)
    
    website = TextField(u'Site web', [validators.optional(), validators.URL(), validators.Length(max=100)],
                        filters=[strip_filter],    
                        description = "Renseignez ici le site Web."
                        )    
                          
    description = TextAreaField('Descriptif', 
                        [validators.optional(), validators.Length(max=1000000)],
                        filters=[strip_filter], 
                        description = u"Vous pouvez insérer les détails"
                        )
                        
    membership = FieldList(FormField(TiersMember))
    
    roles = FieldList(FormField(TiersRole))

class UpdateTiersForm(TiersForm):
    uid = HiddenField()    
    tiers_id = HiddenField()


class ExchCateg(MyBaseForm):
    exch_type = HiddenField()
    exch_subtype = TextField(u'Catégorie', [validators.Length(max=80)],
                        filters=[strip_filter],
                        description = "Le nom de la categorie"
                        )
    description = TextAreaField('Description',
                         filters=[strip_filter])

class UpdateExchangeForm(MyBaseForm):
    exch_id = HiddenField()

class AskCForm(ItineraireForm):
    ConfidenceLevel = [
        ("0",u"exactement à"),
        ("1",u"approximativement à"),
        ("2",u"à peu près (5 à 15 min) vers"),
        ("3",u"à une vache près (1h) vers")
    ]
    DayChoice     = [("4","Jeudi"), ("5","Vendredi"), ("6","Samedi"), ("0","Dimanche"), ("1","Lundi")]
    Day_start     = SelectField(u'Jour', choices=DayChoice )
    Confidence    = SelectField(u'Confiance', choices=ConfidenceLevel)
    Hour_start    = TextField(u'Heure', [validators.Length(max=5,
                        message=u"doit faire au maximum 5 caractères"),
                      validators.Regexp("\d+:\d+", 
                        message=u"doit être sous la forme HH:MM")],
                        filters=[strip_filter])
    start_time    = HiddenField()      
    start_place   = SelectField(u'En partant de', coerce=int)
    arrival_place = SelectField(u'et à destination de', coerce=int)
    itin_id       = HiddenField()

class AskHForm(MyBaseForm):
    DayChoice     = [("4",u"Jeudi à Vendredi"), ("5",u"Vendredi à Samedi"), ("6",u"Samedi à Dimanche"), ("0",u"Dimanche à Lundi")]
    Day_start     = SelectField(u'Pour la nuit de', choices=DayChoice )
    start_time    = HiddenField()
    description   = TextAreaField(u'Description de vos contraintes éventuelles', filters=[strip_filter],
                        description = u"Décrivez ici vos souhaits et éventuellement "
                        + u"les contraintes à prendre en compte. N'hésitez pas à donner des détails."
                    )
    
class AskMForm(MyBaseForm):
    DayChoice     = [("4","Jeudi"), ("5","Vendredi"), ("6","Samedi"), ("0","Dimanche"), ("1","Lundi")]
    Day_start     = SelectField(u"à partir de", choices=DayChoice )
    Hour_start    = TextField(u'vers', [validators.Length(max=5,
                        message=u"doit faire au maximum 5 caractères"),
                      validators.Regexp("\d+:\d+", 
                        message=u"doit être sous la forme HH:MM")],
                        filters=[strip_filter])    
    start_time    = HiddenField()
    Day_end       = SelectField(u"Jusqu'à", choices=DayChoice )
    Hour_end      = TextField(u'vers', [validators.Length(max=5,
                        message=u"doit faire au maximum 5 caractères"),
                      validators.Regexp("\d+:\d+", 
                        message=u"doit être sous la forme HH:MM")],
                        filters=[strip_filter])    
    end_time      = HiddenField()
    exch_categ    = SelectField(u'Catégorie de matériel', coerce=int,
                        description = u"Choisissez une catégorie de bien"
                    )
    description   = TextAreaField(u'Description du bien', filters=[strip_filter],
                        description = u"Décrivez ici les biens que vous souhaitez"
                        + u"échanger. N'hésitez pas à donner des détails."
                    )
    
class PropCForm(ItineraireForm):
    ConfidenceLevel = [
        ("0",u"exactement à"),
        ("1",u"approximativement à"),
        ("2",u"à peu près (5 à 15 min) vers"),
        ("3",u"à une vache près (1h) vers")
    ]
    DayChoice     = [("4","Jeudi"), ("5","Vendredi"), ("6","Samedi"), ("0","Dimanche"), ("1","Lundi")]
    Day_start     = SelectField(u'Jour', choices=DayChoice )
    Confidence    = SelectField(u'Confiance', choices=ConfidenceLevel)
    Hour_start    = TextField(u'Heure', [validators.Length(max=5,
                        message=u"doit faire au maximum 5 caractères"),
                      validators.Regexp("\d+:\d+", 
                        message=u"doit être sous la forme HH:MM")],
                        filters=[strip_filter])
    start_time    = HiddenField()    
    start_place   = SelectField(u'En partant de', coerce=int)
    arrival_place = SelectField(u'et à destination de', coerce=int)
    itin_id       = HiddenField()
    
class PropHForm(MyBaseForm):
    DayChoice     = [("4",u"Jeudi à Vendredi"), ("5",u"Vendredi à Samedi"), ("6",u"Samedi à Dimanche"), ("0",u"Dimanche à Lundi")]
    Day_start     = SelectField(u'Pour la nuit de', choices=DayChoice )
    start_time    = HiddenField()
    exch_categ    = SelectField(u'Type de couchage', coerce=int,
                        description = u"Indiquez ici le type de couchage proposé")    
    description   = TextAreaField(u'Quelques mots autour du logement que vous proposez', filters=[strip_filter],
                        description = u"Décrivez ici quelques détails sur le logement que vous souhaitez "
                        + u"proposer, les contraintes à prendre en compte. N'hésitez pas à donner des détails."
                    )
    place_id      = SelectField(u'Emplacement', coerce=int,
                        description = u"Indiquez ici une des adresses que vous avez proposé")

class PropMForm(MyBaseForm):
    DayChoice     = [("4","Jeudi"), ("5","Vendredi"), ("6","Samedi"), ("0","Dimanche"), ("1","Lundi")]
    Day_start     = SelectField(u"à partir de", choices=DayChoice )
    Hour_start    = TextField(u'vers', [validators.Length(max=5,
                        message=u"doit faire au maximum 5 caractères"),
                      validators.Regexp("\d+:\d+", 
                        message=u"doit être sous la forme HH:MM")],
                        filters=[strip_filter])
    start_time    = HiddenField()
    Day_end       = SelectField(u"Jusqu'a ", choices=DayChoice )
    Hour_end      = TextField(u'vers', [validators.Length(max=5,
                        message=u"doit faire au maximum 5 caractères"),
                      validators.Regexp("\d+:\d+", 
                        message=u"doit être sous la forme HH:MM")],
                        filters=[strip_filter])
    end_time      = HiddenField()
    exch_categ    = SelectField(u'Catégorie de matériel', coerce=int,
                        description = u"Choisissez une catégorie de bien matériel"
                    )
    description   = TextAreaField(u'Ajoutez quelques mots autour du matériel que vous proposez', filters=[strip_filter],
                        description = u"Décrivez ici quelques détails sur le matériel que vous souhaitez "
                        + u"proposer. N'hésitez pas à donner des détails."
                    )

class UpdateAskCForm(AskCForm, UpdateExchangeForm):
    pass

class UpdateAskHForm(AskHForm, UpdateExchangeForm):
    pass

class UpdateAskMForm(AskMForm, UpdateExchangeForm):
    pass

class UpdatePropCForm(PropCForm, UpdateExchangeForm):
    pass
    
class UpdatePropHForm(PropHForm, UpdateExchangeForm):
    pass

class UpdatePropMForm(PropMForm, UpdateExchangeForm):
    pass
