text: from django.conf import settings
  from django.db import models
  from django.utils.translation import ugettext_lazy as _
  
  
  class SessionManager(models.Manager):
      use_in_migrations = True
  
      def encode(self, session_dict):
          """
          Returns the given session dictionary serialized and encoded as a string.
          """
          return SessionStore().encode(session_dict)
  
      def save(self, session_key, session_dict, expire_date):
          s = self.model(session_key, self.encode(session_dict), expire_date)
          if session_dict:
              s.save()
          else:
              s.delete()  # Clear sessions with no data.
          return s
  
  
  class Session(models.Model):
      """
      Session objects containing user session information.
  
      Django provides full support for anonymous sessions. The session
      framework lets you store and retrieve arbitrary data on a
      per-site-visitor basis. It stores data on the server side and
      abstracts the sending and receiving of cookies. Cookies contain a
      session ID -- not the data itself.
  
      Additionally this session object providers the following properties:
      ``user``, ``user_agent`` and ``ip``.
      """
      session_key = models.CharField(_('session key'), max_length=40,
                                     primary_key=True)
      session_data = models.TextField(_('session data'))
      expire_date = models.DateTimeField(_('expiry date'), db_index=True)
      objects = SessionManager()
  
      class Meta:
          verbose_name = _('session')
          verbose_name_plural = _('sessions')
  
      def get_decoded(self):
          return SessionStore(None, None).decode(self.session_data)
  
      user = models.ForeignKey(getattr(settings, 'AUTH_USER_MODEL', 'auth.User'),
                               null=True, on_delete=models.CASCADE)
      user_agent = models.TextField(null=True, blank=True)
      last_activity = models.DateTimeField(auto_now=True)
      ip = models.GenericIPAddressField(null=True, blank=True, verbose_name='IP')
  
  
  # At bottom to avoid circular import
  from .backends.db import SessionStore  # noqa: E402 isort:skip
  