I posted this to django-developers instead, so if you want to reply go
find that thread and do it there.

On Jun 23, 3:33 am, Andy Kelley <superjo...@gmail.com> wrote:
> God damn it, the most dangerous thing about Dvorak is hitting tab
> instead of or along with apostrophe. "don'<tab>t " translates into
> "don'" <send message>
>
> Anyways, I think this idea has merit - even alongside a role-based
> security system.
>
> Feedback?
>
> On Jun 23, 3:29 am, Andy Kelley <superjo...@gmail.com> wrote:
>
> > I am coming up with a framework that helps serialization of models. My
> > idea is for each field to have a view permissions level: PUBLIC,
> > OWNER, or ADMIN. I want to have a model to dict function that takes 2
> > arguments, permission_level and serialize_chain. Firstly, let me
> > explain how it would change models.py:
>
> > from django.db import models
> > from django.contrib.auth.models import User
> > class Profile(models.Model):
> >     user = models.ForeignKey(User, permission=PUBLIC)
> >     bio = models.TextField(permission=PUBLIC)
> >     activated = models.BooleanField(default=False, permission=OWNER)
> >     activate_code = models.CharField(max_length=256, permission=ADMIN)
> >     pages_bookmarked = models.ManyToManyField('Page',
> > related_name='profile_pages_bookmarked', permission=OWNER)
>
> > So, in this example, let's think about when we serialize Profile into
> > a dictionary (for later turning into JSON for ajax). user is the only
> > special case, so skip that mentally for now. Anyone is able to view a
> > profile's bio. A person can view their own profile's activation status
> > and what pages they have bookmarked. But only the system can read the
> > activate_code. Of course the default value for permission would be
> > ADMIN, so you'd have to explicitly allow fields to be sent to the
> > browser.
>
> > OK, and how would the serialization work? Let's look at a view
> > function.
>
> > from django.shortcuts import get_object_or_404
> > from django.http import HttpResponse
> > import simplejson as json
>
> > def ajax_profile_info(request, id):
> >     id = int(id)
> >     profile = get_object_or_404(Profile, id=id)
> >     # ok now we want to serialize profile for sending to json.
> >     # let's say this is the ajax view for getting data about OTHER
> > people.
> >     return json_response(profile.serialize(PUBLIC))
>
> > def json_response(data):
> >     return HttpResponse(json.dumps(data), mimetype="text/plain")
>
> > So in this view, only fields with the PUBLIC will get rendered into
> > the dict. Let's say it was a view function for looking at a person's
> > own account settings. Then we would pass OWNER to the serialize
> > function and we would get all PUBLIC fields + OWNER fields.
>
> > OK that's dandy, but I have one other idea to make serialization
> > awesome. When you have models that foreignkey all over the place, it's
> > a pain to create a nice json object that follows the chain to the
> > exact depth that you want. So let me complicate the model a little
> > bit.
>
> > from django.db import models
> > from django.contrib.auth.models import User
>
> > class Profile(models.Model):
> >     user = models.ForeignKey(User, permission=PUBLIC)
> >     bio = models.TextField(permission=PUBLIC)
> >     activated = models.BooleanField(default=False, permission=OWNER)
> >     activate_code = models.CharField(max_length=256, permission=ADMIN)
> >     books_read = models.ManyToManyField('Book',
> > related_name='profile_pages_bookmarked', permission=PUBLIC)
>
> > class Book(models.Model):
> >     title = models.CharField(max_length=100, permission=PUBLIC)
> >     protagonist = models.ForeignKey('Character', permission=PUBLIC)
> >     language_used = models.ForeignKey('Language', permission=PUBLIC)
> >     cover_art_plan = models.ForeignKey('CoverArtPlan',
> > permission=PUBLIC)
> >     internal_admin_thing = models.IntegerField(permission=ADMIN)
>
> > class Character(models.Model):
> >     name = models.CharField(max_length=100, permission=PUBLIC)
>
> > class Language(models.Model):
> >     name = models.CharField(max_length=100, permission=PUBLIC)
>
> > class CoverArtPlan(models.Model):
> >     name = models.CharField(max_length=100, permission=PUBLIC)
>
> > OK so let's say I'm making a page where we see all the books a person
> > has read (and the info about those books). Here's a view function:
>
> > def ajax_books_read(request, profile_id):
> >     id = int(id)
> >     profile = get_object_or_404(Profile, id=id)
> >     return json_response(profile.serialize(PUBLIC),
> > ['books_read.protagonist', 'books_read.language_used'])
>
> > So this second argument, the serialize_chain, says that we want to
> > serialize profile into a dict, and the books_read field, instead of
> > containing a list of ids, should contain a list of serialized Books.
> > And since we have a dot there, when Profile passes it's serialization
> > request on to Book, it cuts off the "books_read." and passes the rest
> > to Book, so that book sees ['protagonist', 'language_used']. so when
> > Book serializes, its 'protagonist' field is the serialization of the
> > Character instead of just an id. Same for 'language_used'. However,
> > since cover_art_plan was not included, it is simply the id of the
> > CoverArtPlan instead of following the link. Also of note, since we
> > serialized with PUBLIC, internal_admin_thing is completely left out of
> > Book's serialized data.
>
> > A note about access levels: let's say Profile was serialized with
> > OWNER access, when it serializes its books_read, it doesn't pass
> > OWNER, it de-escalates the access level to PUBLIC. However if you
> > serialize Profile with ADMIN access, it does pass admin when it
> > serializes its links. Think about it; it makes sense.
>
> > Anyways, I would like to know if
>
> > 1) Does a solution like this already exist? and if not
> > 2) Is this cool enough to go into django core? or contrib or whatever.
>
> > I got some feedback from mattmcc in #django:
> > <mattmcc> superjoe: At first glance, I'd be more inclined to look at a
> > role-based access control mechanism that doesn't obligate hardcoding
> > permission levels on to model fields..
>
> > However I don'

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to