/shabti/templates/formalchemy/+package+/model/identity.py_tmpl

https://bitbucket.org/gawel/shabti · Unknown · 94 lines · 71 code · 23 blank · 0 comment · 0 complexity · 2e5df56071cba4e1c4a787efa8e202f2 MD5 · raw file

  1. from datetime import datetime
  2. from elixir import *
  3. from elixir import events
  4. import hashlib
  5. from {{package}}.model import Session, metadata
  6. options_defaults['inheritance'] = 'multi'
  7. def encrypt_value(value):
  8. return hashlib.sha1(value).hexdigest()
  9. class NotAuthenticated(Exception):pass
  10. class User(Entity):
  11. username = Field(Unicode(30), unique=True) # undocumented
  12. password = Field(String(40)) # undocumented
  13. password_check = Field(String(40)) # undocumented
  14. email = Field(String(255)) # undocumented
  15. created = Field(DateTime) # undocumented
  16. active = Field(Boolean) # undocumented
  17. groups = ManyToMany('Group')
  18. using_options(shortnames=True)
  19. def __repr__(self):
  20. return self.username
  21. __unicode__ = __repr__
  22. @classmethod
  23. def authenticate(cls, username, password):
  24. try:
  25. user=cls.query.filter_by(username=username, active=True).one()
  26. if user and encrypt_value(password) == user.password:
  27. return user
  28. except Exception:
  29. raise NotAuthenticated
  30. raise NotAuthenticated
  31. def validate_password(user, password):
  32. return encrypt_value(password) == user.password
  33. @events.before_insert
  34. @events.before_update
  35. def encrypt_password(self):
  36. if self.password and self.password != self.password_check:
  37. self.password = encrypt_value(self.password)
  38. self.password_check = self.password
  39. @property
  40. def permissions(self):
  41. permissions = set()
  42. for g in self.groups:
  43. permissions = permissions | set(g.permissions)
  44. return permissions
  45. @property
  46. def permission_names(self):
  47. return [p.name for p in self.permissions]
  48. def has_permission(self, perm):
  49. return (perm in self.permission_names)
  50. class Group(Entity):
  51. name = Field(Unicode(30)) # undocumented
  52. description = Field(Unicode(255)) # undocumented
  53. created = Field(DateTime) # undocumented
  54. active = Field(Boolean) # undocumented
  55. users = ManyToMany('User')
  56. permissions = ManyToMany('Permission')
  57. using_options(shortnames=True)
  58. def __repr__(self):
  59. return self.name
  60. __unicode__ = __repr__
  61. class Permission(Entity):
  62. name = Field(Unicode(30)) # undocumented
  63. description = Field(Unicode(255)) # undocumented
  64. groups = ManyToMany('Group', onupdate = 'CASCADE',
  65. ondelete = 'CASCADE', uselist = True)
  66. using_options(shortnames=True)
  67. def __repr__(self):
  68. return self.name
  69. __unicode__ = __repr__
  70. __all__=['User', 'Permission', 'Group', 'NotAuthenticated']
  71. # Overwritten by Shabti formalchemy template