{ "info": { "author": "Florent Messa", "author_email": "florent.messa@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Topic :: Utilities" ], "description": "django-sequere\n==============\n\n.. image:: https://secure.travis-ci.org/thoas/django-sequere.png?branch=master\n :alt: Build Status\n :target: http://travis-ci.org/thoas/django-sequere\n\nA Django application to implement a follow system and a timeline using multiple backends (db, redis, etc.).\n\nThe timeline engine can be found in ``sequere.contrib.timeline``.\n\nInstallation\n------------\n\n1. Either check out the package from GitHub_ or it pull from a release via PyPI ::\n\n pip install django-sequere\n\n\n2. Add ``sequere`` to your ``INSTALLED_APPS``\n\n.. code-block:: python\n\n INSTALLED_APPS = (\n 'sequere',\n )\n\nUsage\n-----\n\nIn Sequere any resources can follow any resources and vice versa.\n\nLet's say you have two models:\n\n.. code-block:: python\n\n # models.py\n\n from django.db import models\n\n class User(models.Model):\n username = models.CharField(max_length=150)\n\n\n class Project(models.Model):\n name = models.CharField(max_length=150)\n\n\nNow you to register them in sequere to identify them when a resource is following\nanother one.\n\n.. code-block:: python\n\n # sequere_registry.py\n\n from .models import Project, User\n\n import sequere\n\n sequere.register(User)\n sequere.register(Project)\n\n\nSequere uses the same concepts as `Django Admin`_, so if you have already used it,\nyou will not be lost.\n\nYou can now use Sequere like any other application, let's play with it:\n\n.. code-block:: python\n\n >>> from sequere.models import (follow, unfollow, get_followings_count, is_following,\n get_followers_count, get_followers, get_followings)\n\n >>> from myapp.models import User, Project\n\n >>> user = User.objects.create(username='thoas')\n\n >>> project = Project.objects.create(name='La classe americaine')\n\n >>> follow(user, project) # thoas will now follow \"La classe americaine\"\n\n >>> is_following(user, project)\n True\n\n >>> get_followers_count(project)\n 1\n\n >>> get_followings_count(user)\n 1\n\n >>> get_followers(user)\n []\n\n >>> get_followers(project)\n [(, datetime.datetime(2013, 10, 25, 4, 41, 31, 612067))]\n\n >>> get_followings(user)\n [(>> from myapp.models import User, Project\n\n >>> user = User.objects.create(username='thoas')\n\n >>> project = Project.objects.create(name'La classe americaine')\n\n >>> user.follow(project) # thoas will now follow \"La classe americaine\"\n\n >>> user.is_following(project)\n True\n\n >>> project.get_followers_count()\n 1\n\n >>> user.get_followings_count()\n 1\n\n >>> user.get_followers()\n []\n\n >>> project.get_followers()\n [(, datetime.datetime(2013, 10, 25, 4, 41, 31, 612067))]\n\n >>> user.get_followings()\n [( 1\n SET sequere:uid:{identifier}:{id} 1\n HMSET sequere:uid::{id} identifier {identifier} object_id {id}\n\nStore followers count ::\n\n INCR sequere:uid:{to_uid}:followers:count => 1\n INCR sequere:uid:{to_uid}:followers:{from_identifier}:count => 1\n\nStore followings count ::\n\n INCR sequere:uid:{from_uid}:followings:count => 1\n INCR sequere:uid:{from_uid}:followings:{to_identifier}:count => 1\n\n\nAdd a new follower ::\n\n ZADD sequere:uid:{to_uid}:followers {from_uid} {timestamp}\n ZADD sequere:uid:{to_uid}:followers:{from_identifier} {from_uid} {timestamp}\n\nAdd a new following ::\n\n ZADD sequere:uid:{from_uid}:followings {to_uid} {timestamp}\n ZADD sequere:uid:{from_uid}:followings{to_identifier} {to_uid} {timestamp}\n\n\nRetrieve the followers uids ::\n\n ZRANGEBYSCORE sequere:uid:{uid}:followers -inf +inf\n\nRetrieve the followings uids ::\n\n ZRANGEBYSCORE sequere:uid:{uid}:followings =inf +inf\n\nWith this implementation you can retrieve your followers ordered ::\n\n ZREVRANGEBYSCORE sequere:uid:{uid}:followers +inf -inf\n\n\nTimeline\n--------\n\nThe timeline engine is directly based on ``sequere`` resources system.\n\nConcept\n.......\n\nA ``Timeline`` is basically a list of ``Action``.\n\nAn ``Action`` is represented by:\n\n- ``actor`` which is the actor of the action\n- ``verb`` which is the action name\n- ``target`` which is the target of the action (not required)\n- ``date`` which is the date when the action has been done\n\nInstallation\n............\n\nYou have to follow installation instructions of ``sequere`` first before installing\n``sequere.contrib.timeline``.\n\nAdd ``sequere.contrib.timeline`` to your ``INSTALLED_APPS``\n\n.. code-block:: python\n\n INSTALLED_APPS = (\n 'sequere.contrib.timeline',\n )\n\n``sequere.contrib.timeline`` requires `celery`_ to work properly,\nso you will have to install it.\n\nUsage\n.....\n\nYou have to register your actions based on your resources, for example\n\n.. code-block:: python\n\n # sequere_registry.py\n\n from .models import Project, User\n\n from sequere.contrib.timeline import Action\n from sequere import register\n from sequere.base import ModelBase\n\n\n # actions\n class JoinAction(Action):\n verb = 'join'\n\n\n class LikeAction(Action):\n verb = 'like'\n\n # resources\n class ProjectSequere(ModelBase):\n identifier = 'project'\n\n class UserSequere(ModelBase):\n identifier = 'user'\n\n actions = (JoinAction, LikeAction, )\n\n # register resources\n register(User, UserSequere)\n register(Project, ProjectSequere)\n\n\nNow we have registered our actions we can play with the timeline API\n\n.. code-block:: python\n\n >>> from sequere.models import (follow, unfollow)\n\n >>> from sequere.contrib.timeline import Timeline\n\n >>> from myapp.models import User, Project\n\n >>> from myapp.sequere_registry import JoinAction, LikeAction\n\n >>> thoas = User.objects.create(username='thoas')\n\n >>> project = Project.objects.create(name='La classe americaine')\n\n >>> timeline = Timeline(thoas) # create a timeline\n\n >>> timeline.save(JoinAction(actor=thoas)) # save the action in the timeline\n\n >>> timeline.get_private()\n []\n\n >>>: timeline.get_public()\n []\n\nWhen the resource is the actor of its own action then we push the action both\nin **private** and **public** timelines.\n\nNow we have to test the system with the follow process\n\n.. code-block:: python\n\n >>> newbie = User.objects.create(username='newbie')\n\n >>> follow(newbie, thoas) # newbie is now following thoas\n\n >>> Timeline(newbie).get_private() # thoas actions now appear in the private timeline of newbie\n []\n\n >>> Timeline(newbie).get_public()\n []\n\nWhen **A** is following **B** we copy actions of **B** in the private\ntimeline of **A**, `celery`_ is needed to handle these asynchronous tasks.\n\n.. code-block:: python\n\n >>> unfollow(newbie, thoas)\n\n >>> Timeline(newbie).get_private()\n []\n\nWhen **A** is unfollowing **B** we delete the actions of **B** in the private\ntimeline of **A**.\n\nAs you may have noticed the ``JoinAction`` is an action which does not need a target,\nsome actions will need target, ``sequere.contrib.timeline`` provides a quick way\nto query actions for a specific target.\n\n.. code-block:: python\n\n >>> timeline = Timeline(thoas)\n\n >>> timeline.save(LikeAction(actor=thoas, target=project))\n\n >>> timeline.get_private()\n [, ]\n\n >>> timeline.get_private(target=Project) # only retrieve actions with Project resource as target\n []\n\n >>> timeline.get_private(target='project') # only retrieve actions with 'project' identifier as target\n []\n\nConfiguration\n-------------\n\n``SEQUERE_BACKEND``\n...................\n\nThe backend used to store follows\n\nDefaults to ``sequere.backends.database.DatabaseBackend``.\n\n``SEQUERE_BACKEND_OPTIONS``\n............................\n\nA dictionary of parameters to pass to the backend, for example with redis:\n\n.. code-block:: python\n\n SEQUERE_BACKEND = 'sequere.backends.redis.RedisBackend'\n SEQUERE_BACKEND_OPTIONS = {\n 'client_class': 'myproject.myapp.mockup.Connection',\n 'options': {\n 'host': 'localhost',\n 'port': 6379,\n 'db': 0,\n },\n 'prefix': 'prefix-used:'\n }\n\nThe (optional) prefix to be used for the key when storing in the Redis database.\n\nDefaults to ``sequere:``.\n\n``SEQUERE_TIMELINE_BACKEND``\n............................\n\nThe backend used to store follows\n\nDefaults to ``sequere.contrib.timeline.redis.RedisBackend``.\n\n``SEQUERE_TIMELINE_BACKEND_OPTIONS``\n....................................\n\nA dictionary of parameters to pass to the backend, for example with redis:\n\n.. code-block:: python\n\n SEQUERE_TIMELINE_BACKEND = 'sequere.contrib.timeline.redis.RedisBackend'\n SEQUERE_TIMELINE_BACKEND_OPTIONS = {\n 'client_class': 'myproject.myapp.mockup.Connection',\n 'options': {\n 'host': 'localhost',\n 'port': 6379,\n 'db': 0,\n },\n 'prefix': 'prefix-used:'\n }\n\nThe (optional) prefix to be used for the key when storing in the Redis database.\n\nDefaults to ``sequere:timeline:``.\n\n\nResources\n---------\n\n- `haplocheirus`_: a Redis backed storage engine for timelines written in Scala\n- `Case study from Redis documentation`_: write a twitter clone\n- `Amico`_: relationships backed by Redis\n- `django-constance`_: a multi-backends settings management application\n\n\n.. _GitHub: https://github.com/thoas/django-sequere\n.. _redis-py: https://github.com/andymccurdy/redis-py\n.. _celery: http://www.celeryproject.org/\n.. _Django Admin: https://docs.djangoproject.com/en/dev/ref/contrib/admin/\n.. _Sorted Sets: http://redis.io/commands#sorted_set\n.. _haplocheirus: https://github.com/twitter/haplocheirus\n.. _Case study from Redis documentation: http://redis.io/topics/twitter-clone\n.. _Amico: https://github.com/agoragames/amico\n.. _Celery: http://www.celeryproject.org/\n.. _django-constance: https://github.com/comoga/django-constance", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/thoas/django-sequere", "keywords": "django,libraries,settings,redis,follow,timeline", "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "django-sequere", "package_url": "https://pypi.org/project/django-sequere/", "platform": "any", "project_url": "https://pypi.org/project/django-sequere/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/thoas/django-sequere" }, "release_url": "https://pypi.org/project/django-sequere/0.4.1/", "requires_dist": null, "requires_python": null, "summary": "A Django application to implement a follow system and a timeline using multiple backends (db, redis, etc.)", "version": "0.4.1" }, "last_serial": 2686198, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "720147b950c5ee347c6820a77e504eaf", "sha256": "e58f370b3b7eea4f2bca9bc7847eac838c26bd05baa67ed563aa2c08331003e8" }, "downloads": -1, "filename": "django-sequere-0.1.tar.gz", "has_sig": true, "md5_digest": "720147b950c5ee347c6820a77e504eaf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15941, "upload_time": "2013-11-25T09:39:23", "url": "https://files.pythonhosted.org/packages/f0/73/d5df5de6b35bae25f40b1e0694093ef5cf6e1b1ef612353a6178b42a1887/django-sequere-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "ace22c2a47efb93e65965b8c0b2c86b7", "sha256": "24fcdda78b041255ccec511bb08f691a27086af897c387b104b88460e20085fd" }, "downloads": -1, "filename": "django-sequere-0.1.1.tar.gz", "has_sig": true, "md5_digest": "ace22c2a47efb93e65965b8c0b2c86b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16115, "upload_time": "2013-11-27T16:19:25", "url": "https://files.pythonhosted.org/packages/ca/4e/0934563b0cd5761261f37d23510929b70bae2d71f5dc559e10eca4a6097c/django-sequere-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "4d228a32b4529e8fc4324e811b20ef4c", "sha256": "5df309d99a8841bf2c6b11d8bcc3fcb6642158a36d5a973df323db23ed36ef5f" }, "downloads": -1, "filename": "django-sequere-0.1.2.tar.gz", "has_sig": true, "md5_digest": "4d228a32b4529e8fc4324e811b20ef4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16160, "upload_time": "2013-11-27T16:41:12", "url": "https://files.pythonhosted.org/packages/db/37/80264908566e54c4dfe2d319f5130eb29fa0ae4eb116959d92cf20cbe76e/django-sequere-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "767269f839eaf30429b8fa6710d7c883", "sha256": "dcc905e10087c5c429c2d843453485811d7bbeee4ddd74dc297e6feeb46a50ba" }, "downloads": -1, "filename": "django-sequere-0.1.3.tar.gz", "has_sig": true, "md5_digest": "767269f839eaf30429b8fa6710d7c883", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16257, "upload_time": "2013-12-02T10:17:58", "url": "https://files.pythonhosted.org/packages/a4/ed/8c5da1f4a2fe0cf1a9c9bbc0d8e58dcdd67fe9fd7e463acfb508c17a82cd/django-sequere-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "c9c7a1ca1d4df0c900429d7e10a97915", "sha256": "8556ef10aa5996fb8f21b7ba85b3e64f25d990befd086051423a15ed152d26e7" }, "downloads": -1, "filename": "django-sequere-0.1.4.tar.gz", "has_sig": true, "md5_digest": "c9c7a1ca1d4df0c900429d7e10a97915", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16379, "upload_time": "2013-12-03T16:12:56", "url": "https://files.pythonhosted.org/packages/82/de/6e66f3d8bf7fa928f01d65f7c425f199a322d5a162763b408b64b8aca867/django-sequere-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "5aaa2bb09e28206c2a84c4199a1f0276", "sha256": "966f40ab524a735be5db13225cbc1a74ce94d5e65595fd92505be4e428721d29" }, "downloads": -1, "filename": "django-sequere-0.1.5.tar.gz", "has_sig": true, "md5_digest": "5aaa2bb09e28206c2a84c4199a1f0276", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16505, "upload_time": "2013-12-04T14:55:37", "url": "https://files.pythonhosted.org/packages/99/f8/690f868fd814c603905bb0321c568922367d0094f7927489308f62ca93bb/django-sequere-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "03c4b3d8c046955078b3540aa331b7a9", "sha256": "6d00d0f65ecaeec857ebd7f6257715bc841933b5889ccc5a9911174733733562" }, "downloads": -1, "filename": "django-sequere-0.1.6.tar.gz", "has_sig": true, "md5_digest": "03c4b3d8c046955078b3540aa331b7a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16626, "upload_time": "2013-12-05T11:35:58", "url": "https://files.pythonhosted.org/packages/27/fe/ffea668f55a9e1d12cbb70882d31bdb3d205b7b919bdf84c22b397f0d20f/django-sequere-0.1.6.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b239892eb35da6d537147bd8b6e52c12", "sha256": "5f61109a8c77425917eb76570dc70d75b56f0be25dd0f6867cf8bf2e74f31574" }, "downloads": -1, "filename": "django-sequere-0.2.0.tar.gz", "has_sig": true, "md5_digest": "b239892eb35da6d537147bd8b6e52c12", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23257, "upload_time": "2014-09-15T10:28:05", "url": "https://files.pythonhosted.org/packages/2b/00/7cca84d706acfd623442fc81c4fce7860442e736f0d3be3ade911a6f94ae/django-sequere-0.2.0.tar.gz" } ], "0.2.0.dev": [ { "comment_text": "", "digests": { "md5": "ff0ddf3153ff8ed34717c931a5f5fc55", "sha256": "0c3ed6df3b8dcd2d442356a2e20728787ed76f1ed37d9a0e88772682e656885b" }, "downloads": -1, "filename": "django-sequere-0.2.0.dev.tar.gz", "has_sig": true, "md5_digest": "ff0ddf3153ff8ed34717c931a5f5fc55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20275, "upload_time": "2014-09-11T12:04:50", "url": "https://files.pythonhosted.org/packages/ad/37/dad6ce84c90ada991cb3b89490a80a7a07958b62aeabab4d9b1ac94a5f4d/django-sequere-0.2.0.dev.tar.gz" } ], "0.2.1": [], "0.2.2": [ { "comment_text": "", "digests": { "md5": "ab6a3cd3f921230b2ccb458b7ecc1e31", "sha256": "4ffd929889fe76443bbdf1dc3e159efe67c4bcbf23a9e3a7bbdc14b307f97e1a" }, "downloads": -1, "filename": "django-sequere-0.2.2.tar.gz", "has_sig": true, "md5_digest": "ab6a3cd3f921230b2ccb458b7ecc1e31", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23472, "upload_time": "2015-02-02T16:47:54", "url": "https://files.pythonhosted.org/packages/dd/bd/814e0068027ce9660ca09a79d1ff97d536195ec088563b9262ccdc204701/django-sequere-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "8d00693c6fe858cc1419a40123cc43f5", "sha256": "7441b7735227a7b1cbbbdecc88758f22e9d9d4b19d03d8284882d92908fb96d2" }, "downloads": -1, "filename": "django-sequere-0.2.3.tar.gz", "has_sig": true, "md5_digest": "8d00693c6fe858cc1419a40123cc43f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23557, "upload_time": "2015-03-26T10:14:17", "url": "https://files.pythonhosted.org/packages/33/f4/002014e834f5cd108e9293f81143e7baf9ea611c390f4493e60591f1486c/django-sequere-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "e94c9bb0ac6cf6989b736167906f420e", "sha256": "d97974c363839aa1913c7ef98f6ea8facac7f244694fc55bcb524543bd80aca5" }, "downloads": -1, "filename": "django-sequere-0.2.4.tar.gz", "has_sig": true, "md5_digest": "e94c9bb0ac6cf6989b736167906f420e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23646, "upload_time": "2015-04-02T11:55:20", "url": "https://files.pythonhosted.org/packages/25/08/63213dcb3ce86a1b4c9c4cb5aee6f9896e5d2fe5efefbd138bcd4cf415af/django-sequere-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "ba8b515088b001cc4d630637939f9163", "sha256": "8ba62e01d7ad3b28e7513821829b07a14820cd9db00906d40448cf441ee10d8a" }, "downloads": -1, "filename": "django-sequere-0.2.5.tar.gz", "has_sig": true, "md5_digest": "ba8b515088b001cc4d630637939f9163", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23742, "upload_time": "2015-11-04T17:44:46", "url": "https://files.pythonhosted.org/packages/00/ce/975bc81d892ffaa1c11dfbb1f1b4bf2754c41dda71f0068094b3e128e64e/django-sequere-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "70ef06bbfed6f977598d0c8a47cd37d3", "sha256": "e70b6478fa6a471c7ff52bb1d1ce406fc7aa47c42eba00b75df3a6b09d26e64f" }, "downloads": -1, "filename": "django-sequere-0.2.6.tar.gz", "has_sig": true, "md5_digest": "70ef06bbfed6f977598d0c8a47cd37d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23564, "upload_time": "2015-12-21T15:24:32", "url": "https://files.pythonhosted.org/packages/e4/74/bb5d6a603f72f4a1dc8d2c9f1091b52403e45c3a51b1483b1bd6bcf4c797/django-sequere-0.2.6.tar.gz" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "7860aaa80762e4b3fff2a15f429af942", "sha256": "325903a984995bf74d4c143bd45d47eb4bf8c530f2563d9fb28e9f6d399f4700" }, "downloads": -1, "filename": "django-sequere-0.2.7.tar.gz", "has_sig": true, "md5_digest": "7860aaa80762e4b3fff2a15f429af942", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23756, "upload_time": "2016-02-25T20:22:52", "url": "https://files.pythonhosted.org/packages/ea/8b/3369130307db4648620cc25143b2a46de91ce911c618e3c08f2b58560e6d/django-sequere-0.2.7.tar.gz" } ], "0.2.8": [ { "comment_text": "", "digests": { "md5": "0176c15a81d91035cfab468910c6c8bb", "sha256": "e4464a0ff148009cc422bfb05e7544b0678482d350d3248afdfdccc4d14e25e9" }, "downloads": -1, "filename": "django-sequere-0.2.8.tar.gz", "has_sig": true, "md5_digest": "0176c15a81d91035cfab468910c6c8bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23765, "upload_time": "2016-03-01T11:03:33", "url": "https://files.pythonhosted.org/packages/db/09/083d090d10954d5ed6c0450f26666fd70a25e8354c59e7d4c9a43fc0b82c/django-sequere-0.2.8.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "18969aec9a94b3c9c74c5bd2a3ba8987", "sha256": "b5b2360789b975cb50ed7d028e5cff1cb73b1e76f2c3952ec26aabc4ead80a42" }, "downloads": -1, "filename": "django-sequere-0.3.0.tar.gz", "has_sig": true, "md5_digest": "18969aec9a94b3c9c74c5bd2a3ba8987", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23804, "upload_time": "2016-03-04T08:51:27", "url": "https://files.pythonhosted.org/packages/22/00/bba05fcb525b55cba601c4806c3e07619f31fdfa2a60efd6086eaf25238f/django-sequere-0.3.0.tar.gz" } ], "0.4.0": [], "0.4.1": [ { "comment_text": "", "digests": { "md5": "95ad7f9784dcb56bf51dea957d00851f", "sha256": "5308c1401974d792af25e0bdff4c858892186d5a9356fe8353c554930072aca3" }, "downloads": -1, "filename": "django-sequere-0.4.1.tar.gz", "has_sig": false, "md5_digest": "95ad7f9784dcb56bf51dea957d00851f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20527, "upload_time": "2017-03-06T16:05:33", "url": "https://files.pythonhosted.org/packages/f9/b7/076498ed80d4f198066cbc020d3bd920c6b21f9232d4e3974f8a495da77c/django-sequere-0.4.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "95ad7f9784dcb56bf51dea957d00851f", "sha256": "5308c1401974d792af25e0bdff4c858892186d5a9356fe8353c554930072aca3" }, "downloads": -1, "filename": "django-sequere-0.4.1.tar.gz", "has_sig": false, "md5_digest": "95ad7f9784dcb56bf51dea957d00851f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20527, "upload_time": "2017-03-06T16:05:33", "url": "https://files.pythonhosted.org/packages/f9/b7/076498ed80d4f198066cbc020d3bd920c6b21f9232d4e3974f8a495da77c/django-sequere-0.4.1.tar.gz" } ] }