2
0
mirror of https://expo.survex.com/repositories/troggle/.git synced 2024-11-22 07:11:52 +00:00

TRansX speedup for import + remove fossil profiles

This commit is contained in:
Philip Sargent 2020-07-22 23:06:15 +01:00
parent fbf5daff0e
commit 070157eacb
5 changed files with 394 additions and 381 deletions

View File

@ -23,6 +23,7 @@ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
print(" - settings on loading databaseReset.py")
import django
print(" - Memory footprint before loading Django: {:.3f} MB".format(resource.getrusage(resource.RUSAGE_SELF)[2]/1024.0))
try:
django.setup()
@ -44,8 +45,7 @@ from django.contrib.auth.models import User
from troggle.core.models import get_process_memory
from troggle.core.models_caves import Cave, Entrance
from troggle.parsers.imports import import_caves, import_people, import_surveyscans, \
import_logbooks, import_QMs, import_survex, import_loadpos, import_drawingsfiles, \
import_subcaves
import_logbooks, import_QMs, import_survex, import_loadpos, import_drawingsfiles
import troggle.logbooksdump
if os.geteuid() == 0:

View File

@ -7,6 +7,7 @@ from django.db import connection, close_old_connections, connections
from django.contrib.auth.models import User
from django.http import HttpResponse
#from django.urls import reverse, resolve
from django.db import transaction
import troggle.settings
import troggle.parsers.caves
@ -19,37 +20,47 @@ import troggle.parsers.subcaves
def import_caves():
print("-- Importing Caves to ",end="")
print(django.db.connections.databases['default']['NAME'])
troggle.parsers.caves.readcaves()
# wrap the entire import in a transaction
with transaction.atomic():
troggle.parsers.caves.readcaves()
def import_people():
print("-- Importing People (folk.csv) to ",end="")
print(django.db.connections.databases['default']['NAME'])
troggle.parsers.people.LoadPersonsExpos()
with transaction.atomic():
troggle.parsers.people.LoadPersonsExpos()
def import_surveyscans():
print("-- Importing Survey Scans")
troggle.parsers.surveys.LoadListScans()
with transaction.atomic():
troggle.parsers.surveys.LoadListScans()
def import_logbooks():
print("-- Importing Logbooks")
troggle.parsers.logbooks.LoadLogbooks()
with transaction.atomic():
troggle.parsers.logbooks.LoadLogbooks()
def import_QMs():
print("-- Importing old QMs for 161, 204, 234 from CSV files")
troggle.parsers.QMs.Load_QMs()
with transaction.atomic():
troggle.parsers.QMs.Load_QMs()
def import_survex():
# when this import is moved to the top with the rest it all crashes horribly
import troggle.parsers.survex
with transaction.atomic():
import troggle.parsers.survex
print("-- Importing Survex and Entrance Positions")
print(" - Survex Blocks")
troggle.parsers.survex.LoadSurvexBlocks()
with transaction.atomic():
troggle.parsers.survex.LoadSurvexBlocks()
print(" - Survex entrances x/y/z Positions")
troggle.parsers.survex.LoadPositions()
with transaction.atomic():
troggle.parsers.survex.LoadPositions()
def import_loadpos():
# when this import is moved to the top with the rest it all crashes horribly
import troggle.parsers.survex
with transaction.atomic():
import troggle.parsers.survex
print(" - Survex entrances x/y/z Positions")
troggle.parsers.survex.LoadPositions()

View File

@ -1,47 +1,49 @@
"""
URLConf for Django user profile management.
# # url(r'^profiles/', include('profiles.urls')), # not used ? Delete this entire app then.
Recommended usage is to use a call to ``include()`` in your project's
root URLConf to include this URLConf for any URL beginning with
'/profiles/'.
# """
# URLConf for Django user profile management.
If the default behavior of the profile views is acceptable to you,
simply use a line like this in your root URLConf to set up the default
URLs for profiles::
# Recommended usage is to use a call to ``include()`` in your project's
# root URLConf to include this URLConf for any URL beginning with
# '/profiles/'.
(r'^profiles/', include('profiles.urls')),
# If the default behavior of the profile views is acceptable to you,
# simply use a line like this in your root URLConf to set up the default
# URLs for profiles::
But if you'd like to customize the behavior (e.g., by passing extra
arguments to the various views) or split up the URLs, feel free to set
up your own URL patterns for these views instead. If you do, it's a
good idea to keep the name ``profiles_profile_detail`` for the pattern
which points to the ``profile_detail`` view, since several views use
``reverse()`` with that name to generate a default post-submission
redirect. If you don't use that name, remember to explicitly pass
``success_url`` to those views.
# (r'^profiles/', include('profiles.urls')),
"""
# But if you'd like to customize the behavior (e.g., by passing extra
# arguments to the various views) or split up the URLs, feel free to set
# up your own URL patterns for these views instead. If you do, it's a
# good idea to keep the name ``profiles_profile_detail`` for the pattern
# which points to the ``profile_detail`` view, since several views use
# ``reverse()`` with that name to generate a default post-submission
# redirect. If you don't use that name, remember to explicitly pass
# ``success_url`` to those views.
from django.conf.urls import *
from django.urls import *
# """
from profiles import views
# from django.conf.urls import *
# from django.urls import *
# from profiles import views
urlpatterns = [
url(r'^select/$',
views.select_profile,
name='profiles_select_profile'),
url(r'^create/$',
views.create_profile,
name='profiles_create_profile'),
url(r'^edit/$',
views.edit_profile,
name='profiles_edit_profile'),
url(r'^(?P<username>\w+)/$',
views.profile_detail,
name='profiles_profile_detail'),
url(r'^$',
views.profile_list,
name='profiles_profile_list'),
]
# urlpatterns = [
# url(r'^select/$',
# views.select_profile,
# name='profiles_select_profile'),
# url(r'^create/$',
# views.create_profile,
# name='profiles_create_profile'),
# url(r'^edit/$',
# views.edit_profile,
# name='profiles_edit_profile'),
# url(r'^(?P<username>\w+)/$',
# views.profile_detail,
# name='profiles_profile_detail'),
# url(r'^$',
# views.profile_list,
# name='profiles_profile_list'),
# ]

View File

@ -1,52 +1,52 @@
"""
Utility functions for retrieving and generating forms for the
site-specific user profile model specified in the
``AUTH_PROFILE_MODULE`` setting.
# """
# Utility functions for retrieving and generating forms for the
# site-specific user profile model specified in the
# ``AUTH_PROFILE_MODULE`` setting.
"""
# """
from django import forms
from django.conf import settings
#from django.contrib.auth.models import SiteProfileNotAvailable
# from django import forms
# from django.conf import settings
# #from django.contrib.auth.models import SiteProfileNotAvailable
try:
from django.contrib.auth.models import SiteProfileNotAvailable
except ImportError: # django >= 1.7
SiteProfileNotAvailable = type('SiteProfileNotAvailable', (Exception,), {})
# try:
# from django.contrib.auth.models import SiteProfileNotAvailable
# except ImportError: # django >= 1.7
# SiteProfileNotAvailable = type('SiteProfileNotAvailable', (Exception,), {})
from django.db import models
#from django.db.models import get_model
# from django.db import models
# #from django.db.models import get_model
def get_profile_model():
"""
Return the model class for the currently-active user profile
model, as defined by the ``AUTH_PROFILE_MODULE`` setting. If that
setting is missing, raise
``django.contrib.auth.models.SiteProfileNotAvailable``.
# def get_profile_model():
# """
# Return the model class for the currently-active user profile
# model, as defined by the ``AUTH_PROFILE_MODULE`` setting. If that
# setting is missing, raise
# ``django.contrib.auth.models.SiteProfileNotAvailable``.
"""
if (not hasattr(settings, 'AUTH_PROFILE_MODULE')) or \
(not settings.AUTH_PROFILE_MODULE):
raise SiteProfileNotAvailable
profile_mod = models.get_model(*settings.AUTH_PROFILE_MODULE.split('.'))
if profile_mod is None:
raise SiteProfileNotAvailable
return profile_mod
# """
# if (not hasattr(settings, 'AUTH_PROFILE_MODULE')) or \
# (not settings.AUTH_PROFILE_MODULE):
# raise SiteProfileNotAvailable
# profile_mod = models.get_model(*settings.AUTH_PROFILE_MODULE.split('.'))
# if profile_mod is None:
# raise SiteProfileNotAvailable
# return profile_mod
def get_profile_form():
"""
Return a form class (a subclass of the default ``ModelForm``)
suitable for creating/editing instances of the site-specific user
profile model, as defined by the ``AUTH_PROFILE_MODULE``
setting. If that setting is missing, raise
``django.contrib.auth.models.SiteProfileNotAvailable``.
# def get_profile_form():
# """
# Return a form class (a subclass of the default ``ModelForm``)
# suitable for creating/editing instances of the site-specific user
# profile model, as defined by the ``AUTH_PROFILE_MODULE``
# setting. If that setting is missing, raise
# ``django.contrib.auth.models.SiteProfileNotAvailable``.
"""
profile_mod = get_profile_model()
class _ProfileForm(forms.ModelForm):
class Meta:
model = profile_mod
exclude = ('user',) # User will be filled in by the view.
return _ProfileForm
# """
# profile_mod = get_profile_model()
# class _ProfileForm(forms.ModelForm):
# class Meta:
# model = profile_mod
# exclude = ('user',) # User will be filled in by the view.
# return _ProfileForm

View File

@ -1,361 +1,361 @@
"""
Views for creating, editing and viewing site-specific user profiles.
"""
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.urls import reverse, resolve
from django.http import Http404
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.views.generic.list import ListView
from django import forms
from troggle.core.models import Person
from profiles import utils
from django.conf import settings
class SelectPersonForm(forms.Form): #This and the select_profile view
person = forms.ModelChoiceField(queryset=Person.objects.all())
def select_profile(request):
if request.method == 'POST':
form = SelectPersonForm(request.POST)
if form.is_valid():
profile_obj=form.cleaned_data['person']
profile_obj.user=request.user
profile_obj.save()
return HttpResponseRedirect(profile_obj.get_absolute_url())
else:
form = SelectPersonForm()
context = RequestContext(request)
return render_to_response('profiles/select_profile.html', {
'form':form,},
context_instance=context
)
def create_profile(request, form_class=None, success_url=None,
template_name='profiles/create_profile.html',
extra_context=None):
"""
Create a profile for the current user, if one doesn't already
exist.
If the user already has a profile, as determined by
``request.user.get_profile()``, a redirect will be issued to the
:view:`profiles.views.edit_profile` view. If no profile model has
been specified in the ``AUTH_PROFILE_MODULE`` setting,
``django.contrib.auth.models.SiteProfileNotAvailable`` will be
raised.
**Optional arguments:**
``extra_context``
A dictionary of variables to add to the template context. Any
callable object in this dictionary will be called to produce
the end result which appears in the context.
``form_class``
The form class to use for validating and creating the user
profile. This form class must define a method named
``save()``, implementing the same argument signature as the
``save()`` method of a standard Django ``ModelForm`` (this
view will call ``save(commit=False)`` to obtain the profile
object, and fill in the user before the final save). If the
profile object includes many-to-many relations, the convention
established by ``ModelForm`` of using a method named
``save_m2m()`` will be used, and so your form class should
also define this method.
If this argument is not supplied, this view will use a
``ModelForm`` automatically generated from the model specified
by ``AUTH_PROFILE_MODULE``.
``success_url``
The URL to redirect to after successful profile creation. If
this argument is not supplied, this will default to the URL of
:view:`profiles.views.profile_detail` for the newly-created
profile object.
``template_name``
The template to use when displaying the profile-creation
form. If not supplied, this will default to
:template:`profiles/create_profile.html`.
**Context:**
``form``
The profile-creation form.
**Template:**
``template_name`` keyword argument, or
:template:`profiles/create_profile.html`.
"""
try:
profile_obj = request.user.get_profile()
return HttpResponseRedirect(profile_obj.get_absolute_url())
except ObjectDoesNotExist:
pass
#
# We set up success_url here, rather than as the default value for
# the argument. Trying to do it as the argument's default would
# mean evaluating the call to reverse() at the time this module is
# first imported, which introduces a circular dependency: to
# perform the reverse lookup we need access to profiles/urls.py,
# but profiles/urls.py in turn imports this module.
#
if success_url is None:
success_url = reverse('profiles_profile_detail',
kwargs={ 'username': request.user.username })
if form_class is None:
form_class = utils.get_profile_form()
if request.method == 'POST':
form = form_class(data=request.POST, files=request.FILES)
if form.is_valid():
profile_obj = form.save(commit=False)
profile_obj.user = request.user
profile_obj.save()
if hasattr(form, 'save_m2m'):
form.save_m2m()
return HttpResponseRedirect(success_url)
else:
form = form_class()
if extra_context is None:
extra_context = {}
context = RequestContext(request)
for key, value in list(extra_context.items()):
context[key] = callable(value) and value() or value
return render_to_response(template_name,
{ 'form': form, 'settings':settings },
context_instance=context)
create_profile = login_required(create_profile)
def edit_profile(request, form_class=None, success_url=None,
template_name='profiles/edit_profile.html',
extra_context=None):
"""
Edit the current user's profile.
If the user does not already have a profile (as determined by
``User.get_profile()``), a redirect will be issued to the
:view:`profiles.views.create_profile` view; if no profile model
has been specified in the ``AUTH_PROFILE_MODULE`` setting,
``django.contrib.auth.models.SiteProfileNotAvailable`` will be
raised.
**Optional arguments:**
``extra_context``
A dictionary of variables to add to the template context. Any
callable object in this dictionary will be called to produce
the end result which appears in the context.
``form_class``
The form class to use for validating and editing the user
profile. This form class must operate similarly to a standard
Django ``ModelForm`` in that it must accept an instance of the
object to be edited as the keyword argument ``instance`` to
its constructor, and it must implement a method named
``save()`` which will save the updates to the object. If this
argument is not specified, this view will use a ``ModelForm``
generated from the model specified in the
``AUTH_PROFILE_MODULE`` setting.
``success_url``
The URL to redirect to following a successful edit. If not
specified, this will default to the URL of
:view:`profiles.views.profile_detail` for the profile object
being edited.
``template_name``
The template to use when displaying the profile-editing
form. If not specified, this will default to
:template:`profiles/edit_profile.html`.
**Context:**
``form``
The form for editing the profile.
``profile``
The user's current profile.
**Template:**
``template_name`` keyword argument or
:template:`profiles/edit_profile.html`.
"""
try:
profile_obj = request.user.get_profile()
except ObjectDoesNotExist:
return HttpResponseRedirect(reverse('profiles_create_profile'))
#
# See the comment in create_profile() for discussion of why
# success_url is set up here, rather than as a default value for
# the argument.
#
if success_url is None:
success_url = reverse('profiles_profile_detail',
kwargs={ 'username': request.user.username })
if form_class is None:
form_class = utils.get_profile_form()
if request.method == 'POST':
form = form_class(data=request.POST, files=request.FILES, instance=profile_obj)
if form.is_valid():
form.save()
return HttpResponseRedirect(success_url)
else:
form = form_class(instance=profile_obj)
if extra_context is None:
extra_context = {}
context = RequestContext(request)
for key, value in list(extra_context.items()):
context[key] = callable(value) and value() or value
return render_to_response(template_name,
{ 'form': form,
'profile': profile_obj, },
context_instance=context)
edit_profile = login_required(edit_profile)
def profile_detail(request, username, public_profile_field=None,
template_name='profiles/profile_detail.html',
extra_context=None):
"""
Detail view of a user's profile.
If no profile model has been specified in the
``AUTH_PROFILE_MODULE`` setting,
``django.contrib.auth.models.SiteProfileNotAvailable`` will be
raised.
If the user has not yet created a profile, ``Http404`` will be
raised.
**Required arguments:**
``username``
The username of the user whose profile is being displayed.
**Optional arguments:**
``extra_context``
A dictionary of variables to add to the template context. Any
callable object in this dictionary will be called to produce
the end result which appears in the context.
``public_profile_field``
The name of a ``BooleanField`` on the profile model; if the
value of that field on the user's profile is ``False``, the
``profile`` variable in the template will be ``None``. Use
this feature to allow users to mark their profiles as not
being publicly viewable.
If this argument is not specified, it will be assumed that all
users' profiles are publicly viewable.
``template_name``
The name of the template to use for displaying the profile. If
not specified, this will default to
:template:`profiles/profile_detail.html`.
**Context:**
``profile``
The user's profile, or ``None`` if the user's profile is not
publicly viewable (see the description of
``public_profile_field`` above).
**Template:**
``template_name`` keyword argument or
:template:`profiles/profile_detail.html`.
"""
user = get_object_or_404(User, username=username)
try:
profile_obj = user.get_profile()
except ObjectDoesNotExist:
raise Http404
if public_profile_field is not None and \
not getattr(profile_obj, public_profile_field):
profile_obj = None
if extra_context is None:
extra_context = {}
context = RequestContext(request)
for key, value in list(extra_context.items()):
context[key] = callable(value) and value() or value
return render_to_response(template_name,
{ 'profile': profile_obj },
context_instance=context)
def profile_list(request, public_profile_field=None,
template_name='profiles/profile_list.html', **kwargs):
"""
A list of user profiles.
If no profile model has been specified in the
``AUTH_PROFILE_MODULE`` setting,
``django.contrib.auth.models.SiteProfileNotAvailable`` will be
raised.
**Optional arguments:**
``public_profile_field``
The name of a ``BooleanField`` on the profile model; if the
value of that field on a user's profile is ``False``, that
profile will be excluded from the list. Use this feature to
allow users to mark their profiles as not being publicly
viewable.
If this argument is not specified, it will be assumed that all
users' profiles are publicly viewable.
``template_name``
The name of the template to use for displaying the profiles. If
not specified, this will default to
:template:`profiles/profile_list.html`.
Additionally, all arguments accepted by the
:view:`django.views.generic.list_detail.object_list` generic view
will be accepted here, and applied in the same fashion, with one
exception: ``queryset`` will always be the ``QuerySet`` of the
model specified by the ``AUTH_PROFILE_MODULE`` setting, optionally
filtered to remove non-publicly-viewable proiles.
**Context:**
Same as the :view:`django.views.generic.list_detail.object_list`
generic view.
**Template:**
``template_name`` keyword argument or
:template:`profiles/profile_list.html`.
"""
profile_model = utils.get_profile_model()
queryset = profile_model._default_manager.all()
if public_profile_field is not None:
queryset = queryset.filter(**{ public_profile_field: True })
kwargs['queryset'] = queryset
return object_list(request, template_name=template_name, **kwargs)
# """
# Views for creating, editing and viewing site-specific user profiles.
# """
# from django.contrib.auth.decorators import login_required
# from django.contrib.auth.models import User
# from django.core.exceptions import ObjectDoesNotExist
# from django.urls import reverse, resolve
# from django.http import Http404
# from django.http import HttpResponseRedirect
# from django.shortcuts import get_object_or_404
# from django.shortcuts import render_to_response
# from django.template import RequestContext
# from django.views.generic.list import ListView
# from django import forms
# from troggle.core.models import Person
# from profiles import utils
# from django.conf import settings
# class SelectPersonForm(forms.Form): #This and the select_profile view
# person = forms.ModelChoiceField(queryset=Person.objects.all())
# def select_profile(request):
# if request.method == 'POST':
# form = SelectPersonForm(request.POST)
# if form.is_valid():
# profile_obj=form.cleaned_data['person']
# profile_obj.user=request.user
# profile_obj.save()
# return HttpResponseRedirect(profile_obj.get_absolute_url())
# else:
# form = SelectPersonForm()
# context = RequestContext(request)
# return render_to_response('profiles/select_profile.html', {
# 'form':form,},
# context_instance=context
# )
# def create_profile(request, form_class=None, success_url=None,
# template_name='profiles/create_profile.html',
# extra_context=None):
# """
# Create a profile for the current user, if one doesn't already
# exist.
# If the user already has a profile, as determined by
# ``request.user.get_profile()``, a redirect will be issued to the
# :view:`profiles.views.edit_profile` view. If no profile model has
# been specified in the ``AUTH_PROFILE_MODULE`` setting,
# ``django.contrib.auth.models.SiteProfileNotAvailable`` will be
# raised.
# **Optional arguments:**
# ``extra_context``
# A dictionary of variables to add to the template context. Any
# callable object in this dictionary will be called to produce
# the end result which appears in the context.
# ``form_class``
# The form class to use for validating and creating the user
# profile. This form class must define a method named
# ``save()``, implementing the same argument signature as the
# ``save()`` method of a standard Django ``ModelForm`` (this
# view will call ``save(commit=False)`` to obtain the profile
# object, and fill in the user before the final save). If the
# profile object includes many-to-many relations, the convention
# established by ``ModelForm`` of using a method named
# ``save_m2m()`` will be used, and so your form class should
# also define this method.
# If this argument is not supplied, this view will use a
# ``ModelForm`` automatically generated from the model specified
# by ``AUTH_PROFILE_MODULE``.
# ``success_url``
# The URL to redirect to after successful profile creation. If
# this argument is not supplied, this will default to the URL of
# :view:`profiles.views.profile_detail` for the newly-created
# profile object.
# ``template_name``
# The template to use when displaying the profile-creation
# form. If not supplied, this will default to
# :template:`profiles/create_profile.html`.
# **Context:**
# ``form``
# The profile-creation form.
# **Template:**
# ``template_name`` keyword argument, or
# :template:`profiles/create_profile.html`.
# """
# try:
# profile_obj = request.user.get_profile()
# return HttpResponseRedirect(profile_obj.get_absolute_url())
# except ObjectDoesNotExist:
# pass
# #
# # We set up success_url here, rather than as the default value for
# # the argument. Trying to do it as the argument's default would
# # mean evaluating the call to reverse() at the time this module is
# # first imported, which introduces a circular dependency: to
# # perform the reverse lookup we need access to profiles/urls.py,
# # but profiles/urls.py in turn imports this module.
# #
# if success_url is None:
# success_url = reverse('profiles_profile_detail',
# kwargs={ 'username': request.user.username })
# if form_class is None:
# form_class = utils.get_profile_form()
# if request.method == 'POST':
# form = form_class(data=request.POST, files=request.FILES)
# if form.is_valid():
# profile_obj = form.save(commit=False)
# profile_obj.user = request.user
# profile_obj.save()
# if hasattr(form, 'save_m2m'):
# form.save_m2m()
# return HttpResponseRedirect(success_url)
# else:
# form = form_class()
# if extra_context is None:
# extra_context = {}
# context = RequestContext(request)
# for key, value in list(extra_context.items()):
# context[key] = callable(value) and value() or value
# return render_to_response(template_name,
# { 'form': form, 'settings':settings },
# context_instance=context)
# create_profile = login_required(create_profile)
# def edit_profile(request, form_class=None, success_url=None,
# template_name='profiles/edit_profile.html',
# extra_context=None):
# """
# Edit the current user's profile.
# If the user does not already have a profile (as determined by
# ``User.get_profile()``), a redirect will be issued to the
# :view:`profiles.views.create_profile` view; if no profile model
# has been specified in the ``AUTH_PROFILE_MODULE`` setting,
# ``django.contrib.auth.models.SiteProfileNotAvailable`` will be
# raised.
# **Optional arguments:**
# ``extra_context``
# A dictionary of variables to add to the template context. Any
# callable object in this dictionary will be called to produce
# the end result which appears in the context.
# ``form_class``
# The form class to use for validating and editing the user
# profile. This form class must operate similarly to a standard
# Django ``ModelForm`` in that it must accept an instance of the
# object to be edited as the keyword argument ``instance`` to
# its constructor, and it must implement a method named
# ``save()`` which will save the updates to the object. If this
# argument is not specified, this view will use a ``ModelForm``
# generated from the model specified in the
# ``AUTH_PROFILE_MODULE`` setting.
# ``success_url``
# The URL to redirect to following a successful edit. If not
# specified, this will default to the URL of
# :view:`profiles.views.profile_detail` for the profile object
# being edited.
# ``template_name``
# The template to use when displaying the profile-editing
# form. If not specified, this will default to
# :template:`profiles/edit_profile.html`.
# **Context:**
# ``form``
# The form for editing the profile.
# ``profile``
# The user's current profile.
# **Template:**
# ``template_name`` keyword argument or
# :template:`profiles/edit_profile.html`.
# """
# try:
# profile_obj = request.user.get_profile()
# except ObjectDoesNotExist:
# return HttpResponseRedirect(reverse('profiles_create_profile'))
# #
# # See the comment in create_profile() for discussion of why
# # success_url is set up here, rather than as a default value for
# # the argument.
# #
# if success_url is None:
# success_url = reverse('profiles_profile_detail',
# kwargs={ 'username': request.user.username })
# if form_class is None:
# form_class = utils.get_profile_form()
# if request.method == 'POST':
# form = form_class(data=request.POST, files=request.FILES, instance=profile_obj)
# if form.is_valid():
# form.save()
# return HttpResponseRedirect(success_url)
# else:
# form = form_class(instance=profile_obj)
# if extra_context is None:
# extra_context = {}
# context = RequestContext(request)
# for key, value in list(extra_context.items()):
# context[key] = callable(value) and value() or value
# return render_to_response(template_name,
# { 'form': form,
# 'profile': profile_obj, },
# context_instance=context)
# edit_profile = login_required(edit_profile)
# def profile_detail(request, username, public_profile_field=None,
# template_name='profiles/profile_detail.html',
# extra_context=None):
# """
# Detail view of a user's profile.
# If no profile model has been specified in the
# ``AUTH_PROFILE_MODULE`` setting,
# ``django.contrib.auth.models.SiteProfileNotAvailable`` will be
# raised.
# If the user has not yet created a profile, ``Http404`` will be
# raised.
# **Required arguments:**
# ``username``
# The username of the user whose profile is being displayed.
# **Optional arguments:**
# ``extra_context``
# A dictionary of variables to add to the template context. Any
# callable object in this dictionary will be called to produce
# the end result which appears in the context.
# ``public_profile_field``
# The name of a ``BooleanField`` on the profile model; if the
# value of that field on the user's profile is ``False``, the
# ``profile`` variable in the template will be ``None``. Use
# this feature to allow users to mark their profiles as not
# being publicly viewable.
# If this argument is not specified, it will be assumed that all
# users' profiles are publicly viewable.
# ``template_name``
# The name of the template to use for displaying the profile. If
# not specified, this will default to
# :template:`profiles/profile_detail.html`.
# **Context:**
# ``profile``
# The user's profile, or ``None`` if the user's profile is not
# publicly viewable (see the description of
# ``public_profile_field`` above).
# **Template:**
# ``template_name`` keyword argument or
# :template:`profiles/profile_detail.html`.
# """
# user = get_object_or_404(User, username=username)
# try:
# profile_obj = user.get_profile()
# except ObjectDoesNotExist:
# raise Http404
# if public_profile_field is not None and \
# not getattr(profile_obj, public_profile_field):
# profile_obj = None
# if extra_context is None:
# extra_context = {}
# context = RequestContext(request)
# for key, value in list(extra_context.items()):
# context[key] = callable(value) and value() or value
# return render_to_response(template_name,
# { 'profile': profile_obj },
# context_instance=context)
# def profile_list(request, public_profile_field=None,
# template_name='profiles/profile_list.html', **kwargs):
# """
# A list of user profiles.
# If no profile model has been specified in the
# ``AUTH_PROFILE_MODULE`` setting,
# ``django.contrib.auth.models.SiteProfileNotAvailable`` will be
# raised.
# **Optional arguments:**
# ``public_profile_field``
# The name of a ``BooleanField`` on the profile model; if the
# value of that field on a user's profile is ``False``, that
# profile will be excluded from the list. Use this feature to
# allow users to mark their profiles as not being publicly
# viewable.
# If this argument is not specified, it will be assumed that all
# users' profiles are publicly viewable.
# ``template_name``
# The name of the template to use for displaying the profiles. If
# not specified, this will default to
# :template:`profiles/profile_list.html`.
# Additionally, all arguments accepted by the
# :view:`django.views.generic.list_detail.object_list` generic view
# will be accepted here, and applied in the same fashion, with one
# exception: ``queryset`` will always be the ``QuerySet`` of the
# model specified by the ``AUTH_PROFILE_MODULE`` setting, optionally
# filtered to remove non-publicly-viewable proiles.
# **Context:**
# Same as the :view:`django.views.generic.list_detail.object_list`
# generic view.
# **Template:**
# ``template_name`` keyword argument or
# :template:`profiles/profile_list.html`.
# """
# profile_model = utils.get_profile_model()
# queryset = profile_model._default_manager.all()
# if public_profile_field is not None:
# queryset = queryset.filter(**{ public_profile_field: True })
# kwargs['queryset'] = queryset
# return object_list(request, template_name=template_name, **kwargs)