default_attributes = {}
def __init__(self, *args, **kwargs):
    ceilometer_services = CeilometerService.get_service_objects().all()
    if ceilometer_services:
        self._meta.get_field("provider_service").default = ceilometer_services[0].id
    super(MonitoringPublisher, self).__init__(*args, **kwargs)

def can_update(self, user):
    #Allow creation of this model instances for non-admin users also
    return True

@property
def creator(self):
    from core.models import User
    if getattr(self, "cached_creator", None):
        return self.cached_creator
    creator_id=self.get_attribute("creator_id")
    if not creator_id:
        return None
    users=User.objects.filter(id=creator_id)
    if not users:
        return None
    user=users[0]
    self.cached_creator = users[0]
    return user

@creator.setter
def creator(self, value):
    if value:
        value = value.id
    if (value != self.get_attribute("creator_id", None)):
        self.cached_creator=None
    self.set_attribute("creator_id", value)