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.