# helpful functions for mail

# django-newformsadmin
from django.db import models
from django.conf import settings

def get_hash(cleartext, salt = None):
    from crypt import crypt
    from random import getrandbits
    if not salt:
        salt = '%s' % getrandbits(16)
    return crypt(cleartext, salt)

def form_to_model_save(modelObject, form):
    """  Updates a Django ORM Object modelObject with values from the form """
    # If we want to save many_to_many-relations on newly created
    # objects, we first have to save it w/o the relation so that it has
    # a primary key. Only then we can add the m2m-relation
    postponed = {}
    for key in form.cleaned_data:
        try:
            setattr(modelObject, key, form.cleaned_data[key])
        except ValueError, e:
            postponed[key] = form.cleaned_data[key]
    modelObject.save()

    for key in postponed:
        setattr(modelObject, key, postponed[key])
    modelObject.save()

class EnabledManager(models.Manager):
    """
    A manager that only has enabled objets in it's queryset (determined 
    by ModelObject.enabled)
    """
    def get_query_set(self):
        return super(EnabledManager, self).get_query_set().filter(enabled=True)

class AddressManager(EnabledManager):
    """
    An EnabledManager specific to mail.Address class
    has filter_addresses and get_addresses, they handle a full address 
    conviniently (ie split them up in local_part, domain and perform the 
    relevant queries)
    """
    def filter_addresses(self, full_address, *args, **kwargs):
        parts = full_address.split('@')
        return self.filter(address=parts[0], domain__name=parts[1],
                *args, **kwargs)

    def get_address(self, full_address):
        parts = full_address.split('@')
        return self.get(address=parts[0], domain__name=parts[1])

