From b5b068e8dce90e45a41149c94b30b742655cf618 Mon Sep 17 00:00:00 2001 From: Diane Trout Date: Tue, 18 Aug 2009 22:41:26 +0000 Subject: [PATCH] Add a custom (inherited) user object named HTSUser to the samples table. This is so I can attach users (and their email addresses) to the affiliation object. --- htsworkflow/frontend/samples/admin.py | 83 +++++++++++--------- htsworkflow/frontend/samples/auth_backend.py | 32 ++++++++ htsworkflow/frontend/samples/models.py | 18 ++++- htsworkflow/frontend/settings.py | 12 ++- 4 files changed, 108 insertions(+), 37 deletions(-) create mode 100644 htsworkflow/frontend/samples/auth_backend.py diff --git a/htsworkflow/frontend/samples/admin.py b/htsworkflow/frontend/samples/admin.py index c7d543a..d686e21 100644 --- a/htsworkflow/frontend/samples/admin.py +++ b/htsworkflow/frontend/samples/admin.py @@ -1,18 +1,42 @@ from django.contrib import admin from django.contrib.admin import widgets +from django.contrib.admin.models import User +from django.contrib.auth.admin import UserAdmin from django.db import models from django.utils.translation import ugettext_lazy as _ -from htsworkflow.frontend.samples.models import Antibody, Cellline, Condition, ExperimentType, LibraryType, Species, Affiliation, Library, Tag +from htsworkflow.frontend.samples.models import Antibody, Cellline, Condition, ExperimentType, HTSUser, LibraryType, Species, Affiliation, Library, Tag from htsworkflow.frontend.experiments.models import Lane +class AffiliationOptions(admin.ModelAdmin): + list_display = ('name','contact','email') + fieldsets = ( + (None, { + 'fields': (('name','contact','email','users')) + }), + ) -class LaneLibraryInline(admin.StackedInline): - model = Lane - extra = 0 + # some post 1.0.2 version of django has formfield_overrides + # which would replace this code with: + # formfield_overrids = { + # models.ManyToMany: { 'widget': widgets.FilteredSelectMultiple } + # } + def formfield_for_dbfield(self, db_field, **kwargs): + if db_field.name == 'users': + kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical)) + rv = super(AffiliationOptions, self).formfield_for_dbfield(db_field, **kwargs) + # print db_field.name, kwargs + return rv -class Library_Inline(admin.TabularInline): - model = Library +class AntibodyOptions(admin.ModelAdmin): + search_fields = ('antigene','nickname','catalog','antibodies','source','biology','notes') + list_display = ('antigene','nickname','antibodies','catalog','source','biology','notes') + list_filter = ('antibodies','source') + fieldsets = ( + (None, { + 'fields': (('antigene','nickname','antibodies'),('catalog','source'),('biology'),('notes')) + }), + ) class CelllineOptions(admin.ModelAdmin): list_display = ('cellline_name', 'nickname', 'notes') @@ -23,11 +47,28 @@ class CelllineOptions(admin.ModelAdmin): }), ) +class ConditionOptions(admin.ModelAdmin): + list_display = (('condition_name'), ('notes'),) + fieldsets = ( + (None, { + 'fields': (('condition_name'),('nickname'),('notes'),) + }), + ) + class ExperimentTypeOptions(admin.ModelAdmin): model = ExperimentType #list_display = ('name',) #fieldsets = ( (None, { 'fields': ('name',) }), ) +class HTSUserOptions(UserAdmin): pass + +class LaneLibraryInline(admin.StackedInline): + model = Lane + extra = 0 + +class Library_Inline(admin.TabularInline): + model = Library + class LibraryTypeOptions(admin.ModelAdmin): model = LibraryType @@ -106,27 +147,6 @@ class LibraryOptions(admin.ModelAdmin): print db_field.name, kwargs return rv -class AffiliationOptions(admin.ModelAdmin): - list_display = ('name','contact','email') - fieldsets = ( - (None, { - 'fields': (('name','contact','email')) - }), - ) - -# class UserOptions(admin.ModelAdmin): -# inlines = [Library_Inline] - -class AntibodyOptions(admin.ModelAdmin): - search_fields = ('antigene','nickname','catalog','antibodies','source','biology','notes') - list_display = ('antigene','nickname','antibodies','catalog','source','biology','notes') - list_filter = ('antibodies','source') - fieldsets = ( - (None, { - 'fields': (('antigene','nickname','antibodies'),('catalog','source'),('biology'),('notes')) - }), - ) - class SpeciesOptions(admin.ModelAdmin): fieldsets = ( (None, { @@ -134,14 +154,6 @@ class SpeciesOptions(admin.ModelAdmin): }), ) -class ConditionOptions(admin.ModelAdmin): - list_display = (('condition_name'), ('notes'),) - fieldsets = ( - (None, { - 'fields': (('condition_name'),('nickname'),('notes'),) - }), - ) - class TagOptions(admin.ModelAdmin): list_display = ('tag_name', 'context') fieldsets = ( @@ -155,6 +167,7 @@ admin.site.register(Antibody, AntibodyOptions) admin.site.register(Cellline, CelllineOptions) admin.site.register(Condition, ConditionOptions) admin.site.register(ExperimentType, ExperimentTypeOptions) +admin.site.register(HTSUser, HTSUserOptions) admin.site.register(LibraryType, LibraryTypeOptions) admin.site.register(Library, LibraryOptions) admin.site.register(Species, SpeciesOptions) diff --git a/htsworkflow/frontend/samples/auth_backend.py b/htsworkflow/frontend/samples/auth_backend.py new file mode 100644 index 0000000..c4960b9 --- /dev/null +++ b/htsworkflow/frontend/samples/auth_backend.py @@ -0,0 +1,32 @@ +from django.conf import settings +from django.contrib.auth.backends import ModelBackend +from django.core.exceptions import ImproperlyConfigured +from django.db.models import get_model + +class HTSUserModelBackend(ModelBackend): + def authenticate(self, username=None, password=None): + try: + user = self.user_class.objects.get(username=username) + if user.check_password(password): + return user + #except self.user_class.DoesNotExist: + except Exception, e: + print e + return None + + def get_user(self, user_id): + try: + return self.user_class.objects.get(pk=user_id) + #except self.user_class.DoesNotExist: + except Exception, e: + print e + return None + + @property + def user_class(self): + if not hasattr(self, '_user_class'): + self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.',2)) + if not self._user_class: + raise ImproperlyConfigured('Could not get custom user model') + return self._user_class + diff --git a/htsworkflow/frontend/samples/models.py b/htsworkflow/frontend/samples/models.py index 8650061..4c5df1c 100644 --- a/htsworkflow/frontend/samples/models.py +++ b/htsworkflow/frontend/samples/models.py @@ -1,6 +1,6 @@ import urlparse from django.db import models -from django.contrib.auth.models import User +from django.contrib.auth.models import User, UserManager from htsworkflow.frontend import settings from htsworkflow.frontend.reports.libinfopar import * @@ -102,6 +102,8 @@ class Affiliation(models.Model): name = models.CharField(max_length=256, db_index=True, verbose_name='Name') contact = models.CharField(max_length=256, null=True, blank=True,verbose_name='Lab Name') email = models.EmailField(null=True,blank=True) + users = models.ManyToManyField('HTSUser', null=True) + users.admin_order_field = "username" def __unicode__(self): str = unicode(self.name) @@ -109,6 +111,10 @@ class Affiliation(models.Model): str += u' ('+self.contact+u')' return str + def Users(self): + users = self.users.all().order_by('username') + return ", ".join([unicode(a) for a in users ]) + class Meta: ordering = ["name","contact"] unique_together = (("name", "contact"),) @@ -254,3 +260,13 @@ class Library(models.Model): @models.permalink def get_absolute_url(self): return ('htsworkflow.frontend.samples.views.library_to_flowcells', [str(self.library_id)]) + +class HTSUser(User): + """ + Provide some site-specific customization for the django user class + """ + #objects = UserManager() + + class Meta: + ordering = ['username'] + diff --git a/htsworkflow/frontend/settings.py b/htsworkflow/frontend/settings.py index 852f33c..d4f94a8 100644 --- a/htsworkflow/frontend/settings.py +++ b/htsworkflow/frontend/settings.py @@ -55,7 +55,11 @@ options = ConfigParser.SafeConfigParser( os.path.abspath('/htsworkflow/htswfrontend/dev_fctracker.db'), 'time_zone': 'America/Los_Angeles', 'default_pm': '5', - 'link_flowcell_storage_device_url': "http://localhost:8000/inventory/lts/link/" + 'link_flowcell_storage_device_url': "http://localhost:8000/inventory/lts/link/", + 'printer1_host': '127.0.0.1', + 'printer1_port': '9100', + 'printer2_host': '127.0.0.1', + 'printer2_port': '9100', }) options.read([os.path.expanduser("~/.htsworkflow.ini"), @@ -66,6 +70,9 @@ options.read([os.path.expanduser("~/.htsworkflow.ini"), # to exist in order to retrieve anything. if not options.has_section('frontend'): options.add_section('frontend') +if not options.has_section('bcprinter'): + options.add_section('bcprinter') + # Django settings for elandifier project. @@ -77,6 +84,9 @@ options_to_list(ADMINS, 'admins') MANAGERS = ADMINS +AUTHENTICATION_BACKENDS = ( 'samples.auth_backend.HTSUserModelBackend', ) +CUSTOM_USER_MODEL = 'samples.HTSUser' + EMAIL_HOST = options.get('frontend', 'email_host') EMAIL_PORT = int(options.get('frontend', 'email_port')) -- 2.30.2