Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • djangoldp-packages/djangoldp
  • decentral1se/djangoldp
  • femmefaytale/djangoldp
  • jvtrudel/djangoldp
4 results
Show changes
Showing
with 1813 additions and 380 deletions
# Generated by Django 4.2.3 on 2023-09-03 20:26
from django.db import migrations
import djangoldp.fields
class Migration(migrations.Migration):
dependencies = [
('djangoldp', '0016_alter_activity_options_alter_follower_options_and_more'),
]
operations = [
migrations.AlterField(
model_name='activity',
name='urlid',
field=djangoldp.fields.LDPUrlField(blank=True, db_index=True, null=True, unique=True),
),
migrations.AlterField(
model_name='follower',
name='urlid',
field=djangoldp.fields.LDPUrlField(blank=True, db_index=True, null=True, unique=True),
),
migrations.AlterField(
model_name='ldpsource',
name='urlid',
field=djangoldp.fields.LDPUrlField(blank=True, db_index=True, null=True, unique=True),
),
]
# Generated by Django 4.2.3 on 2023-10-17 19:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('djangoldp', '0017_alter_activity_urlid_alter_follower_urlid_and_more'),
]
operations = [
migrations.AlterField(
model_name='activity',
name='payload',
field=models.TextField(),
),
migrations.AlterField(
model_name='activity',
name='response_body',
field=models.TextField(null=True),
),
]
import json
import logging
import uuid
from django.conf import settings
from django.contrib.auth.models import AnonymousUser, User
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.core.exceptions import ObjectDoesNotExist, ValidationError, FieldDoesNotExist
from django.db import models
from django.db.models.base import ModelBase
from django.db.models.signals import post_save, pre_save, pre_delete, m2m_changed
from django.dispatch import receiver
from django.urls import get_resolver
from django.utils.datastructures import MultiValueDictKeyError
from django.utils.decorators import classonlymethod
from guardian.shortcuts import get_perms
from guardian.shortcuts import assign_perm
from rest_framework.utils import model_meta
from djangoldp.fields import LDPUrlField
from djangoldp.permissions import DEFAULT_DJANGOLDP_PERMISSIONS, OwnerPermissions, InheritPermissions, ReadOnly
logger = logging.getLogger('djangoldp')
User._meta.rdf_type = "foaf:user"
Group._meta.serializer_fields = ['name', 'user_set']
Group._meta.rdf_type = 'foaf:Group'
# Group._meta.rdf_context = {'user_set': 'foaf:member'}
Group._meta.permission_classes = [(OwnerPermissions&ReadOnly)|InheritPermissions]
Group._meta.owner_field = 'user'
Group._meta.inherit_permissions = []
class LDPModelManager(models.Manager):
def local(self):
'''an alternative to all() which exlcudes external resources'''
queryset = super(LDPModelManager, self).all()
internal_ids = [x.pk for x in queryset if not Model.is_external(x)]
return queryset.filter(pk__in=internal_ids)
class Model(models.Model):
urlid = LDPUrlField(blank=True, null=True, unique=True, db_index=True)
is_backlink = models.BooleanField(default=False, help_text='set automatically to indicate the Model is a backlink')
allow_create_backlink = models.BooleanField(default=True,
help_text='set to False to disable backlink creation after Model save')
objects = LDPModelManager()
@classmethod
def get_view_set(cls):
view_set = getattr(cls._meta, 'view_set', getattr(cls.Meta, 'view_set', None))
if view_set is None:
from djangoldp.views import LDPViewSet
view_set = LDPViewSet
return view_set
class Meta:
default_permissions = DEFAULT_DJANGOLDP_PERMISSIONS
abstract = True
depth = 0
def __init__(self, *args, **kwargs):
super(Model, self).__init__(*args, **kwargs)
@classmethod
def get_container_path(cls):
'''returns the url path which is used to access actions on this model (e.g. /users/)'''
path = getattr(cls._meta, 'container_path', getattr(cls.Meta, 'container_path', None))
if path is None:
path = "{}s".format(cls._meta.object_name.lower())
return path
return cls.__clean_path(path)
def get_absolute_url(self):
return Model.resource_id(self)
return Model.absolute_url(self)
@classonlymethod
def absolute_url(cls, instance_or_model):
if isinstance(instance_or_model, ModelBase) or not instance_or_model.urlid:
return '{}{}'.format(settings.SITE_URL, Model.resource(instance_or_model))
else:
return instance_or_model.urlid
def get_container_id(self):
return Model.container_id(self)
@classonlymethod
def resource(cls, instance_or_model):
if isinstance(instance_or_model, ModelBase):
return cls.container_id(instance_or_model)
else:
return cls.resource_id(instance_or_model)
@classonlymethod
def resource_id(cls, instance):
r_id = "{}{}".format(cls.container_id(instance), getattr(instance, cls.slug_field(instance)))
r_id = "{}{}".format(cls.container_id(instance), getattr(instance, cls.slug_field(instance), ""))
return cls.__clean_path(r_id)
@classonlymethod
def slug_field(cls, instance_or_model):
if isinstance(instance_or_model, ModelBase):
object_name = instance_or_model.__name__.lower()
model = instance_or_model
else:
object_name = instance_or_model._meta.object_name.lower()
model = type(instance_or_model)
# Use cached value if present
if hasattr(model, "_slug_field"):
return model._slug_field
object_name = model.__name__.lower()
view_name = '{}-detail'.format(object_name)
slug_field = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][1][0])
try:
slug_field = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][1][0])
except MultiValueDictKeyError:
slug_field = getattr(model._meta, 'lookup_field', 'pk')
if slug_field.startswith('/'):
slug_field = slug_field[1:]
model._slug_field = slug_field
return slug_field
@classonlymethod
......@@ -62,26 +118,44 @@ class Model(models.Model):
return path
class Meta:
default_permissions = ('add', 'change', 'delete', 'view', 'control')
abstract = True
depth = 1
many_depth = 0
@classonlymethod
def resolve_id(cls, id):
'''
Resolves the id of a given path (e.g. /container/1/)
Raises Resolver404 if the path cannot be found, ValidationError if the path is for a model base
and an ObjectDoesNotExist exception if the resource does not exist
'''
id = cls.__clean_path(id)
view, args, kwargs = get_resolver().resolve(id)
match = get_resolver().resolve(id)
kwargs = match.kwargs
view = match.func
if match.url_name.endswith('-list') or len(match.kwargs.keys()) == 0:
raise ValidationError('resolve_id received a path for a container or nested container')
return view.initkwargs['model'].objects.get(**kwargs)
@classonlymethod
def resolve_parent(cls, path):
split = path.strip('/').split('/')
parent_path = "/".join(split[:-1])
return Model.resolve_id(parent_path)
@classonlymethod
def resolve_container(cls, path):
'''retruns the model container of passed URL path'''
path = cls.__clean_path(path)
view, args, kwargs = get_resolver().resolve(path)
return view.initkwargs['model']
@classonlymethod
def resolve(cls, path):
'''
resolves the containing model and associated id in the path. If there is no id in the path returns None
:param path: a URL path to check
:return: the container model and resolved id in a tuple
'''
if path.startswith(settings.BASE_URL):
path = path.replace(settings.BASE_URL, '')
container = cls.resolve_container(path)
try:
resolve_id = cls.resolve_id(path)
......@@ -91,6 +165,7 @@ class Model(models.Model):
@classonlymethod
def __clean_path(cls, path):
'''ensures path is Django-friendly'''
if not path.startswith("/"):
path = "/{}".format(path)
if not path.endswith("/"):
......@@ -98,55 +173,199 @@ class Model(models.Model):
return path
@classonlymethod
def get_permission_classes(cls, related_model, default_permissions_classes):
return cls.get_meta(related_model, 'permission_classes', default_permissions_classes)
def get_or_create(cls, model, urlid, update=False, **field_tuples):
'''
gets an object with the passed urlid if it exists, creates it if not
:param model: the model class which the object belongs to
:param update: if set to True the object will be updated with the passed field_tuples
:param field_tuples: kwargs for the model creation/updating
:return: the object, fetched or created
:raises Exception: if the object does not exist, but the data passed is invalid
'''
try:
rval = model.objects.get(urlid=urlid)
if update:
for field in field_tuples.keys():
setattr(rval, field, field_tuples[field])
rval.save()
return rval
except ObjectDoesNotExist:
if model is get_user_model():
field_tuples['username'] = str(uuid.uuid4())
return model.objects.create(urlid=urlid, is_backlink=True, **field_tuples)
@classonlymethod
def get_meta(cls, model_class, meta_name, default=None):
if hasattr(model_class, 'Meta'):
meta = getattr(model_class.Meta, meta_name, default)
else:
meta = default
return getattr(model_class._meta, meta_name, meta)
def get_or_create_external(cls, model, urlid, **kwargs):
'''
checks that the parameterised urlid is external and then returns the result of Model.get_or_create
:raises ObjectDoesNotExist: if the urlid is not external and the object doesn't exist
'''
if not Model.is_external(urlid) and not model.objects.filter(urlid=urlid).exists():
raise ObjectDoesNotExist
return Model.get_or_create(model, urlid, **kwargs)
@staticmethod
def get_permissions(obj_or_model, user_or_group, filter):
permissions = filter
for permission_class in Model.get_permission_classes(obj_or_model, []):
permissions = permission_class().filter_user_perms(user_or_group, obj_or_model, permissions)
@classonlymethod
def get_subclass_with_rdf_type(cls, type):
#TODO: deprecate
'''returns Model subclass with Meta.rdf_type matching parameterised type, or None'''
if type == 'foaf:user':
return get_user_model()
if not isinstance(user_or_group, AnonymousUser):
permissions += get_perms(user_or_group, obj_or_model)
return [{'mode': {'@type': name.split('_')[0]}} for name in permissions]
for subcls in Model.__subclasses__():
if getattr(subcls._meta, "rdf_type", None) == type:
return subcls
return None
class LDPSource(models.Model):
container = models.URLField()
@classmethod
def is_external(cls, value):
'''
:param value: string urlid or an instance with urlid field
:return: True if the urlid is external to the server, False otherwise
'''
try:
if not value:
return False
if not isinstance(value, str):
value = value.urlid
# This expects all @ids to start with http which mlight not be universal. Maybe needs a fix.
return value.startswith('http') and not value.startswith(settings.SITE_URL)
except:
return False
#TODO: this breaks the serializer, which probably assumes that traditional models don't have a urlid.
# models.Model.urlid = property(lambda self: '{}{}'.format(settings.SITE_URL, Model.resource(self)))
class LDPSource(Model):
federation = models.CharField(max_length=255)
class Meta:
rdf_type = 'sib:source'
class Meta(Model.Meta):
rdf_type = 'sib:federatedContainer'
ordering = ('federation',)
permissions = (
('view_source', 'acl:Read'),
('control_source', 'acl:Control'),
)
container_path = 'sources'
lookup_field = 'federation'
def __str__(self):
return "{}: {}".format(self.federation, self.container)
return "{}: {}".format(self.federation, self.urlid)
class LDNotification(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.deletion.CASCADE)
author = models.URLField()
object = models.URLField()
type = models.CharField(max_length=255)
summary = models.TextField()
date = models.DateTimeField(auto_now_add=True)
class Activity(Model):
'''Models an ActivityStreams Activity'''
local_id = LDPUrlField(help_text='/inbox or /outbox url (local - this server)') # /inbox or /outbox full url
external_id = LDPUrlField(null=True, help_text='the /inbox or /outbox url (from the sender or receiver)')
payload = models.TextField()
response_location = LDPUrlField(null=True, blank=True, help_text='Location saved activity can be found')
response_code = models.CharField(null=True, blank=True, help_text='Response code sent by receiver', max_length=8)
response_body = models.TextField(null=True)
type = models.CharField(null=True, blank=True, help_text='the ActivityStreams type of the Activity',
max_length=64)
is_finished = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
success = models.BooleanField(default=False, help_text='set to True when an Activity is successfully delivered')
class Meta:
permissions = (
('view_todo', 'Read'),
('control_todo', 'Control'),
)
class Meta(Model.Meta):
container_path = "activities"
rdf_type = 'as:Activity'
disable_url = True
def to_activitystream(self):
return json.loads(self.payload)
def response_to_json(self):
return self.to_activitystream()
# temporary database-side storage used for scheduled tasks in the ActivityQueue
class ScheduledActivity(Activity):
failed_attempts = models.PositiveIntegerField(default=0,
help_text='a log of how many failed retries have been made sending the activity')
def save(self, *args, **kwargs):
self.is_finished = False
super(ScheduledActivity, self).save(*args, **kwargs)
class Meta(Model.Meta):
disable_url = True
class Follower(Model):
'''Models a subscription on a model. When the model is saved, an Update activity will be sent to the inbox'''
object = models.URLField(help_text='the object being followed')
inbox = models.URLField(help_text='the inbox recipient of updates')
follower = models.URLField(help_text='(optional) the resource/actor following the object', blank=True)
def __str__(self):
return 'Inbox ' + str(self.inbox) + ' on ' + str(self.object)
class Meta(Model.Meta):
disable_url = True
class DynamicNestedField:
'''
Used to define a method as a nested_field.
Usage:
LDPUser.circles = lambda self: Circle.objects.filter(members__user=self)
LDPUser.circles.field = DynamicNestedField(Circle, 'circles')
'''
related_query_name = None
one_to_many = False
many_to_many = True
many_to_one = False
one_to_one = False
read_only = True
name = ''
def __init__(self, model:models.Model|None, remote_name:str, name:str='', remote:object|None=None) -> None:
self.model = model
self.name = name
if remote:
self.remote_field = remote
else:
self.remote_field = DynamicNestedField(None, '', remote_name, self)
@receiver([post_save])
def auto_urlid(sender, instance, **kwargs):
if isinstance(instance, Model):
changed = False
if getattr(instance, Model.slug_field(instance), None) is None:
setattr(instance, Model.slug_field(instance), instance.pk)
changed = True
if (not instance.urlid or 'None' in instance.urlid):
instance.urlid = instance.get_absolute_url()
changed = True
if changed:
instance.save()
@receiver(post_save)
def create_role_groups(sender, instance, created, **kwargs):
if created:
for name, params in getattr(instance._meta, 'permission_roles', {}).items():
group, x = Group.objects.get_or_create(name=f'LDP_{instance._meta.model_name}_{name}_{instance.id}')
setattr(instance, name, group)
instance.save()
if params.get('add_author'):
assert hasattr(instance._meta, 'auto_author'), "add_author requires to also define auto_author"
author = getattr(instance, instance._meta.auto_author)
if author:
group.user_set.add(author)
for permission in params.get('perms', []):
assign_perm(f'{permission}_{instance._meta.model_name}', group, instance)
def invalidate_cache_if_has_entry(entry):
from djangoldp.serializers import GLOBAL_SERIALIZER_CACHE
if GLOBAL_SERIALIZER_CACHE.has(entry):
GLOBAL_SERIALIZER_CACHE.invalidate(entry)
def invalidate_model_cache_if_has_entry(model):
entry = getattr(model._meta, 'label', None)
invalidate_cache_if_has_entry(entry)
@receiver([pre_save, pre_delete])
def invalidate_caches(sender, instance, **kwargs):
invalidate_model_cache_if_has_entry(sender)
@receiver([m2m_changed])
def invalidate_caches_m2m(sender, instance, action, *args, **kwargs):
invalidate_model_cache_if_has_entry(kwargs['model'])
\ No newline at end of file
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
class LDPOffsetPagination(LimitOffsetPagination):
def get_paginated_response(self, data):
next_url = self.get_next_link()
previous_url = self.get_previous_link()
links = []
for url, label in ((previous_url, 'prev'), (next_url, 'next')):
if url is not None:
links.append('<{}>; rel="{}"'.format(url, label))
headers = {'Link': ', '.join(links)} if links else {}
return Response(data, headers=headers)
class LDPPagination(PageNumberPagination):
page_query_param = 'p'
page_size_query_param = 'limit'
def get_paginated_response(self, data):
next_url = self.get_next_link()
previous_url = self.get_previous_link()
links = []
for url, label in ((previous_url, 'prev'), (next_url, 'next')):
if url is not None:
links.append('<{}>; rel="{}"'.format(url, label))
headers = {'Link': ', '.join(links)} if links else {}
return Response(data, headers=headers)
from guardian.shortcuts import get_objects_for_user
from rest_framework import filters
from rest_framework import permissions
from djangoldp.models import Model
"""
Liste des actions passées dans views selon le protocole REST :
list
create
retrieve
update, partial update
destroy
Pour chacune de ces actions, on va définir si on accepte la requête (True) ou non (False)
"""
"""
The instance-level has_object_permission method will only be called if the view-level has_permission
checks have already passed
"""
class WACPermissions(permissions.DjangoObjectPermissions):
perms_map = {
'GET': ['%(app_label)s.view_%(model_name)s'],
'OPTIONS': [],
'HEAD': ['%(app_label)s.view_%(model_name)s'],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}
from copy import copy
from django.conf import settings
from django.http import Http404
from rest_framework.permissions import BasePermission, DjangoObjectPermissions, OR, AND
from rest_framework.filters import BaseFilterBackend
from rest_framework_guardian.filters import ObjectPermissionsFilter
from djangoldp.filters import OwnerFilterBackend, NoFilterBackend, PublicFilterBackend, IPFilterBackend, ActiveFilterBackend
from djangoldp.utils import is_anonymous_user, is_authenticated_user, check_client_ip
def has_permission(self, request, view):
if request.method == 'OPTIONS':
return True
else:
return super().has_permission(request, view)
# This method should be overriden by other permission classes
def user_permissions(self, user, obj):
return []
DEFAULT_DJANGOLDP_PERMISSIONS = {'view', 'add', 'change', 'delete', 'control'}
DEFAULT_RESOURCE_PERMISSIONS = {'view', 'change', 'delete', 'control'}
DEFAULT_CONTAINER_PERMISSIONS = {'view', 'add'}
def filter_user_perms(self, user_or_group, obj, permissions):
return [perm for perm in permissions if perm in self.user_permissions(user_or_group, obj)]
class ObjectFilter(filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
"""
Ensure that queryset only contains objects visible by current user
"""
perm = "view_{}".format(queryset.model._meta.model_name.lower())
objects = get_objects_for_user(request.user, perm, klass=queryset)
return objects
def join_filter_backends(*permissions_or_filters:BaseFilterBackend|BasePermission, model:object, union:bool=False) -> BaseFilterBackend:
'''Creates a new Filter backend by joining a list of existing backends.
It chains the filterings or joins them, depending on the argument union'''
backends = []
for permission_or_filter in permissions_or_filters:
if hasattr(permission_or_filter, 'get_filter_backend'):
backends.append(permission_or_filter.get_filter_backend(model))
elif isinstance(permission_or_filter, type) and issubclass(permission_or_filter, BaseFilterBackend):
backends.append(permission_or_filter)
class JointFilterBackend(BaseFilterBackend):
def __init__(self) -> None:
self.filters = []
for backend in backends:
if backend:
self.filters.append(backend())
def filter_queryset(self, request:object, queryset:object, view:object) -> object:
if union:
result = queryset.none() #starts with empty for union
else:
result = queryset
for filter in self.filters:
if union:
result = result | filter.filter_queryset(request, queryset, view)
else:
result = filter.filter_queryset(request, result, view)
return result
return JointFilterBackend
permission_map ={
'GET': ['%(app_label)s.view_%(model_name)s'],
'OPTIONS': [],
'HEAD': ['%(app_label)s.view_%(model_name)s'],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}
class ObjectPermission(WACPermissions):
filter_class = ObjectFilter
# Patch of OR and AND classes to enable chaining of LDPBasePermission
def OR_get_permissions(self, user, model, obj=None):
perms1 = self.op1.get_permissions(user, model, obj) if hasattr(self.op1, 'get_permissions') else set()
perms2 = self.op2.get_permissions(user, model, obj) if hasattr(self.op2, 'get_permissions') else set()
return set.union(perms1, perms2)
OR.get_permissions = OR_get_permissions
def OR_get_filter_backend(self, model):
return join_filter_backends(self.op1, self.op2, model=model, union=True)
OR.get_filter_backend = OR_get_filter_backend
OR.__repr__ = lambda self: f"{self.op1}|{self.op2}"
def AND_get_permissions(self, user, model, obj=None):
perms1 = self.op1.get_permissions(user, model, obj) if hasattr(self.op1, 'get_permissions') else set()
perms2 = self.op2.get_permissions(user, model, obj) if hasattr(self.op2, 'get_permissions') else set()
return set.intersection(perms1, perms2)
AND.get_permissions = AND_get_permissions
def AND_get_filter_backend(self, model):
return join_filter_backends(self.op1, self.op2, model=model, union=False)
AND.get_filter_backend = AND_get_filter_backend
AND.__repr__ = lambda self: f"{self.op1}&{self.op2}"
class InboxPermissions(WACPermissions):
class LDPBasePermission(BasePermission):
"""
Everybody can create
Author can edit
A base class from which all permission classes should inherit.
Extends the DRF permissions class to include the concept of model-permissions, separate from the view, and to
change to a system of outputting permissions sets for the serialization of WebACLs
"""
anonymous_perms = ['create']
authenticated_perms = ['create']
author_perms = ['view', 'update']
# filter backends associated with the permissions class. This will be used to filter queryset in the (auto-generated)
# view for a model, and in the serializing nested fields
filter_backend = ActiveFilterBackend
# by default, all permissions
permissions = getattr(settings, 'DJANGOLDP_PERMISSIONS', DEFAULT_DJANGOLDP_PERMISSIONS)
# perms_map defines the permissions required for different methods
perms_map = permission_map
@classmethod
def get_filter_backend(cls, model):
'''returns the Filter backend associated with this permission class'''
return cls.filter_backend
def check_all_permissions(self, required_permissions):
'''returns True if the all the permissions are included in the permissions of the class'''
return all([permission.split('.')[1].split('_')[0] in self.permissions for permission in required_permissions])
def get_allowed_methods(self):
'''returns the list of methods allowed for the permissions of the class, depending on the permission map'''
return [method for method, permissions in self.perms_map.items() if self.check_all_permissions(permissions)]
def has_permission(self, request, view):
if view.action in ['create']:
return True
else:
return super().has_permission(request, view)
'''checks if the request is allowed at all, based on its method and the permissions of the class'''
return request.method in self.get_allowed_methods()
def has_object_permission(self, request, view, obj=None):
'''checks if the access to the object is allowed,'''
return self.has_permission(request, view)
def get_permissions(self, user, model, obj=None):
'''returns the permissions the user has on a given model or on a given object'''
return self.permissions.intersection(DEFAULT_RESOURCE_PERMISSIONS if obj else DEFAULT_CONTAINER_PERMISSIONS)
def has_object_permission(self, request, view, obj):
if view.action in ['update', 'partial_update', 'destroy']:
return False
class AnonymousReadOnly(LDPBasePermission):
"""Anonymous users can only view, no check for others"""
permissions = {'view'}
def has_permission(self, request, view):
return super().has_permission(request, view) or is_authenticated_user(request.user)
def get_permissions(self, user, model, obj=None):
if is_anonymous_user(user):
return self.permissions
else:
return super().has_object_permission(request, view, obj)
return super().permissions #all permissions
def user_permissions(self, user, obj):
if user.is_anonymous:
return self.anonymous_perms
else:
if Model.get_meta(obj, 'auto_author') == user:
return self.author_perms
else:
return self.authenticated_perms
class AuthenticatedOnly(LDPBasePermission):
"""Only authenticated users have permissions"""
def has_permission(self, request, view):
return request.method=='OPTIONS' or is_authenticated_user(request.user)
class ReadOnly(LDPBasePermission):
"""Users can only view"""
permissions = {'view'}
class AnonymousReadOnly(WACPermissions):
"""
Anonymous users: can read all posts
Logged in users: can read all posts + create new posts
Author: can read all posts + create new posts + update their own
"""
class ReadAndCreate(LDPBasePermission):
"""Users can only view and create"""
permissions = {'view', 'add'}
anonymous_perms = ['view']
authenticated_perms = ['view', 'add']
author_perms = ['view', 'add', 'change', 'control', 'delete']
class CreateOnly(LDPBasePermission):
"""Users can only view and create"""
permissions = {'add'}
class ACLPermissions(DjangoObjectPermissions, LDPBasePermission):
"""Permissions based on the rights given in db, on model for container requests or on object for resource requests"""
filter_backend = ObjectPermissionsFilter
perms_map = permission_map
def has_permission(self, request, view):
if view.action in ['list', 'retrieve']:
return True
elif view.action == 'create' and request.user.is_authenticated():
return True
else:
if view.action in ('list', 'create'): # The container permission only apply to containers requests
return super().has_permission(request, view)
return True
def has_object_permission(self, request, view, obj):
if view.action == "create" and request.user.is_authenticated():
return True
elif view.action in ["list", "retrieve"]:
def get_permissions(self, user, model, obj=None):
model_name = model._meta.model_name
app_label = model._meta.app_label
if obj:
return {perm.replace('_'+model_name, '') for perm in user.get_all_permissions(obj)}
permissions = set(filter(lambda perm: perm.startswith(app_label) and perm.endswith(model_name), user.get_all_permissions()))
return {perm.replace(app_label+'.', '').replace('_'+model_name, '') for perm in permissions}
class OwnerPermissions(LDPBasePermission):
"""Gives all permissions to the owner of the object"""
filter_backend = OwnerFilterBackend
def check_permission(self, user, model, obj):
if user.is_superuser:
return True
elif view.action in ['update', 'partial_update', 'destroy']:
if hasattr(obj._meta, 'auto_author'):
author = getattr(obj, obj._meta.auto_author)
if author == request.user:
return True
else:
return super().has_object_permission(request, view, obj)
if getattr(model._meta, 'owner_field', None):
field = model._meta.get_field(model._meta.owner_field)
if field.many_to_many or field.one_to_many:
return user in getattr(obj, field.get_accessor_name()).all()
else:
return user == getattr(obj, model._meta.owner_field)
if getattr(model._meta, 'owner_urlid_field', None) is not None:
return is_authenticated_user(user) and user.urlid == getattr(obj, model._meta.owner_urlid_field)
return True
def user_permissions(self, user, obj):
if user.is_anonymous:
return self.anonymous_perms
else:
if Model.get_meta(obj, 'auto_author') == user:
return self.author_perms
def has_object_permission(self, request, view, obj=None):
return self.check_permission(request.user, view.model, obj)
def get_permissions(self, user, model, obj=None):
if not obj or self.check_permission(user, model, obj):
return self.permissions
return set()
class OwnerCreatePermission(LDPBasePermission):
'''only accepts the creation of new resources if the owner of the created resource is the user of the request'''
def check_patch(self, first, second, user):
diff = first - second
return diff == set() or diff == {user.urlid}
def has_permission(self, request:object, view:object) -> bool:
if request.method != 'POST':
return super().has_permission(request, view)
if is_anonymous_user(request.user):
return False
owner = None
if getattr(view.model._meta, 'owner_field', None):
field = view.model._meta.get_field(view.model._meta.owner_field)
if field.many_to_many or field.one_to_many:
owner = request.data[field.get_accessor_name()]
else:
return self.authenticated_perms
owner = request.data[view.model._meta.owner_field]
if getattr(view.model._meta, 'owner_urlid_field', None):
owner = request.data[view.model._meta.owner_urlid_field]
return not owner or owner['@id'] == request.user.urlid
class PublicPermission(LDPBasePermission):
"""Gives read-only access to resources which have a public flag to True"""
filter_backend = PublicFilterBackend
permissions = {'view', 'add'}
def has_object_permission(self, request, view, obj=None):
assert hasattr(view.model._meta, 'public_field'), \
f'Model {view.model} has PublicPermission applied without "public_field" defined'
public_field = view.model._meta.public_field
class LoggedReadOnly(WACPermissions):
"""
Anonymous users: Nothing
Logged in users: can read all posts
"""
if getattr(obj, public_field, False):
return super().has_object_permission(request, view, obj)
return False
anonymous_perms = []
authenticated_perms = ['view']
class JoinMembersPermission(LDPBasePermission):
filter_backend = None
def has_permission(self, request:object, view:object) -> bool:
if is_anonymous_user(request.user):
return False
return request.method == 'PATCH'
def check_patch(self, first, second, user):
diff = first - second
return diff == set() or diff == {user.urlid}
def has_object_permission(self, request:object, view:object, obj:object) -> bool:
'''only accept patch request, only if the only difference on the user_set is the user'''
if not self.has_permission(request, view) or not obj or not 'user_set' in request.data:
return False
new_members = request.data['user_set']
if not isinstance(new_members, list):
new_members = [new_members]
new_ids = {user['@id'] for user in new_members}
old_ids = {user.urlid for user in obj.members.user_set.all()}
return self.check_patch(new_ids, old_ids, request.user) and self.check_patch(old_ids, new_ids, request.user)
def get_permissions(self, user, model, obj=None):
return set()
class IPOpenPermissions(LDPBasePermission):
filter_backend = IPFilterBackend
def has_permission(self, request, view):
if view.action in ['list', 'retrieve'] and request.user.is_authenticated():
return True
else:
return super().has_permission(request, view)
return check_client_ip(request)
def has_object_permission(self, request, view, obj):
if view.action in ["list", "retrieve"] and request.user.is_authenticated():
return True
else:
return super().has_object_permission(request, view, obj)
return check_client_ip(request)
def user_permissions(self, user, obj):
if user.is_anonymous:
return self.anonymous_perms
else:
return self.authenticated_perms
def get_permissions(self, user, model, obj=None):
#Will always say there is no migrations, not taking the IP into accounts
return set()
class InheritPermissions(LDPBasePermission):
"""Gets the permissions from a related objects"""
@classmethod
def get_parent_fields(cls, model: object) -> list:
'''checks that the model is adequately configured and returns the associated model'''
assert hasattr(model._meta, 'inherit_permissions') and isinstance(model._meta.inherit_permissions, list), \
f'Model {model} has InheritPermissions applied without "inherit_permissions" defined as a list'
return model._meta.inherit_permissions
@classmethod
def get_parent_model(cls, model:object, field_name:str) -> object:
parent_model = model._meta.get_field(field_name).related_model
assert hasattr(parent_model._meta, 'permission_classes'), \
f'Related model {parent_model} has no "permission_classes" defined'
return parent_model
def get_parent_objects(self, obj:object, field_name:str) -> list:
'''gets the parent object'''
if obj is None:
return []
field = obj._meta.get_field(field_name)
if field.many_to_many or field.one_to_many:
return getattr(obj, field.get_accessor_name()).all()
parent = getattr(obj, field_name, None)
return [parent] if parent else []
@classmethod
def clone_with_model(self, request:object, view:object, model:object) -> tuple:
'''changes the model on the argument, so that they can be called on the parent model'''
# For some reason if we copy the request itself, we go into an infinite loop, so take the native request instead
_request = copy(request._request)
_request.model = model
_request.data = request.data #because the data is not present on the native request
_request._request = _request #so that it can be nested
_view = copy(view)
_view.queryset = None #to make sure the model is taken into account
_view.model = model
return _request, _view
@classmethod
def generate_filter_backend(cls, parent:object, field_name:str) -> BaseFilterBackend:
'''returns a new Filter backend that applies all filters of the parent model'''
filter_arg = f'{field_name}__in'
backends = {perm().get_filter_backend(parent) for perm in parent._meta.permission_classes}
class InheritFilterBackend(BaseFilterBackend):
def __init__(self) -> None:
self.filters = []
for backend in backends:
if backend:
self.filters.append(backend())
def filter_queryset(self, request:object, queryset:object, view:object) -> object:
request, view = InheritPermissions.clone_with_model(request, view, parent)
for filter in self.filters:
allowed_parents = filter.filter_queryset(request, parent.objects.all(), view)
queryset = queryset.filter(**{filter_arg: allowed_parents})
return queryset
return InheritFilterBackend
@classmethod
def generate_filter_backend_for_none(cls, fields) -> BaseFilterBackend:
'''returns a new Filter backend that checks that none of the parent fields are set'''
class InheritNoneFilterBackend(BaseFilterBackend):
def filter_queryset(self, request:object, queryset:object, view:object) -> object:
return queryset.filter(**{field: None for field in fields})
return InheritNoneFilterBackend
@classmethod
def get_filter_backend(cls, model:object) -> BaseFilterBackend:
'''Returns a union filter backend of all filter backends of parents'''
fields = cls.get_parent_fields(model)
backends = [cls.generate_filter_backend(cls.get_parent_model(model, field), field) for field in fields]
backend_none = cls.generate_filter_backend_for_none(fields)
return join_filter_backends(*backends, backend_none, model=model, union=True)
def has_permission(self, request:object, view:object) -> bool:
'''Returns True unless we're trying to create a resource with a link to a parent we're not allowed to change'''
if request.method == 'POST':
for field in InheritPermissions.get_parent_fields(view.model):
if field in request.data:
model = InheritPermissions.get_parent_model(view.model, field)
parent = model.objects.get(urlid=request.data[field]['@id'])
_request, _view = InheritPermissions.clone_with_model(request, view, model)
if not all([perm().has_object_permission(_request, _view, parent) for perm in model._meta.permission_classes]):
return False
return True
def has_object_permission(self, request:object, view:object, obj:object) -> bool:
'''Returns True if at least one inheriting object has permission'''
if not obj:
return super().has_object_permission(request, view, obj)
parents = []
for field in InheritPermissions.get_parent_fields(view.model):
model = InheritPermissions.get_parent_model(view.model, field)
parent_request, parent_view = InheritPermissions.clone_with_model(request, view, model)
for parent_object in self.get_parent_objects(obj, field):
parents.append(parent_object)
try:
if all([perm().has_object_permission(parent_request, parent_view, parent_object) for perm in model._meta.permission_classes]):
return True
except Http404:
#keep trying
pass
# return False if there were parent resources but none accepted
return False if parents else True
def get_permissions(self, user:object, model:object, obj:object=None) -> set:
'''returns a union of all inheriting linked permissions'''
perms = set()
parents = []
for field in InheritPermissions.get_parent_fields(model):
parent_model = InheritPermissions.get_parent_model(model, field)
for parent_object in self.get_parent_objects(obj, field):
parents.append(parent_object)
perms = perms.union(set.intersection(*[perm().get_permissions(user, parent_model, parent_object)
for perm in parent_model._meta.permission_classes]))
if parents:
return perms
return super().get_permissions(user, model, obj)
\ No newline at end of file
from rest_framework.utils import model_meta
def get_prefetch_fields(model, serializer, depth, prepend_string=''):
'''
This method should then be used with queryset.prefetch_related, to auto-fetch joined resources (to speed up nested serialization)
This can speed up ModelViewSet and LDPViewSet alike by as high a factor as 2
:param model: the model to be analysed
:param serializer: an LDPSerializer instance. Used to extract the fields for each nested model
:param depth: the depth at which to stop the recursion (should be set to the configured depth of the ViewSet)
:param prepend_string: should be set to the default. Used in recursive calls
:return: set of strings to prefetch for a given model. Including serialized nested fields and foreign keys recursively
called on many-to-many fields until configured depth reached
'''
# the objective is to build a list of fields and nested fields which should be prefetched for the optimisation
# of database queries
fields = set()
# get a list of all fields which would be serialized on this model
# TODO: dynamically generating serializer fields is necessary to retrieve many-to-many fields at depth > 0,
# but the _all_ default has issues detecting reverse many-to-many fields
# meta_args = {'model': model, 'depth': 0, 'fields': getattr(model._meta, 'serializer_fields', '__all__')}
# meta_class = type('Meta', (), meta_args)
# serializer = (type(LDPSerializer)('TestSerializer', (LDPSerializer,), {'Meta': meta_class}))()
serializer_fields = set([f for f in serializer.get_fields()])
empty_containers = getattr(model._meta, 'empty_containers', [])
# we are only interested in foreign keys (and many-to-many relationships)
model_relations = model_meta.get_field_info(model).relations
for field_name, relation_info in model_relations.items():
# foreign keys can be added without fuss
if not relation_info.to_many:
fields.add((prepend_string + field_name))
continue
# nested fields should be added if serialized
if field_name in serializer_fields and field_name not in empty_containers:
fields.add((prepend_string + field_name))
# and they should also have their immediate foreign keys prefetched if depth not reached
if depth >= 0:
new_prepend_str = prepend_string + field_name + '__'
fields = fields.union(get_prefetch_fields(relation_info.related_model, serializer, depth - 1, new_prepend_str))
return fields
from collections import OrderedDict, Mapping
import uuid
import json
from collections import OrderedDict
from collections.abc import Mapping, Iterable
from copy import copy
from typing import Any
from urllib import parse
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.exceptions import ImproperlyConfigured
from django.core.exceptions import ValidationError as DjangoValidationError
from django.core.urlresolvers import get_resolver, resolve, get_script_prefix, Resolver404
from django.db import transaction
from django.db.models import QuerySet
from django.urls import resolve, Resolver404, get_script_prefix
from django.urls.resolvers import get_resolver
from django.utils.datastructures import MultiValueDictKeyError
from django.utils.encoding import uri_to_iri
from django.utils.functional import cached_property
from rest_framework.exceptions import ValidationError
from rest_framework.fields import SkipField, empty
from rest_framework.fields import SkipField, empty, ReadOnlyField
from rest_framework.fields import get_error_detail, set_value
from rest_framework.relations import HyperlinkedRelatedField, ManyRelatedField, MANY_RELATION_KWARGS, Hyperlink
from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, ModelSerializer
from rest_framework.relations import HyperlinkedRelatedField, ManyRelatedField, Hyperlink, MANY_RELATION_KWARGS
from rest_framework.serializers import HyperlinkedModelSerializer, ListSerializer, ModelSerializer, LIST_SERIALIZER_KWARGS
from rest_framework.settings import api_settings
from rest_framework.utils import model_meta
from rest_framework.utils.field_mapping import get_nested_relation_kwargs
from rest_framework.utils.serializer_helpers import ReturnDict
from rest_framework.utils.serializer_helpers import ReturnDict, BindingDict
from djangoldp.fields import LDPUrlField, IdURLField
from djangoldp.models import Model
from djangoldp.permissions import DEFAULT_DJANGOLDP_PERMISSIONS
# defaults for various DjangoLDP settings (see documentation)
MAX_RECORDS_SERIALIZER_CACHE = getattr(settings, 'MAX_RECORDS_SERIALIZER_CACHE', 10000)
class InMemoryCache:
def __init__(self):
self.cache = {
}
def reset(self):
self.cache = {
}
def has(self, cache_key, container_urlid=None, vary=None):
return cache_key in self.cache and \
(container_urlid is None or container_urlid in self.cache[cache_key]) and \
(vary is None or vary in self.cache[cache_key][container_urlid])
def get(self, cache_key, container_urlid, vary):
if self.has(cache_key, container_urlid, vary):
return self.cache[cache_key][container_urlid][vary]['value']
else:
return None
def set(self, cache_key, container_urlid, vary, value):
if len(self.cache.keys()) > MAX_RECORDS_SERIALIZER_CACHE:
self.reset()
if cache_key not in self.cache:
self.cache[cache_key] = {}
if container_urlid not in self.cache[cache_key]:
self.cache[cache_key][container_urlid] = {}
self.cache[cache_key][container_urlid][vary] = {'value': value}
def invalidate(self, cache_key, container_urlid=None, vary=None):
# can clear cache_key -> container_urlid -> vary, cache_key -> container_urlid or cache_key
if container_urlid is not None:
if vary is not None:
self.cache[cache_key][container_urlid].pop(vary, None)
else:
self.cache[cache_key].pop(container_urlid, None)
else:
self.cache.pop(cache_key, None)
GLOBAL_SERIALIZER_CACHE = InMemoryCache()
class RDFSerializerMixin:
def add_permissions(self, data, user, model, obj=None):
'''takes a set or list of permissions and returns them in the JSON-LD format'''
if self.parent and not settings.LDP_INCLUDE_INNER_PERMS: #Don't serialize permissions on nested objects
return data
if user.is_superuser:
data['permissions'] = getattr(settings, 'DJANGOLDP_PERMISSIONS', DEFAULT_DJANGOLDP_PERMISSIONS)
return data
permission_classes = getattr(model._meta, 'permission_classes', [])
if not permission_classes:
return data
# The permissions must be given by all permission classes to be granted
permissions = set.intersection(*[permission().get_permissions(user, model, obj) for permission in permission_classes])
# Don't grant delete permissions on containers
if not obj and 'delete' in permissions:
permissions.remove('delete')
data['permissions'] = permissions
return data
def serialize_rdf_fields(self, obj, data, include_context=False):
'''adds the @type and the @context to the data'''
rdf_type = getattr(obj._meta, 'rdf_type', None)
rdf_context = getattr(obj._meta, 'rdf_context', None)
if rdf_type:
data['@type'] = rdf_type
if include_context and rdf_context:
data['@context'] = rdf_context
return data
def serialize_container(self, data, id, user, model, obj=None):
'''turns a list into a container representation'''
return self.add_permissions({'@id': id, '@type': 'ldp:Container', 'ldp:contains': data}, user, model, obj)
class LDListMixin:
class LDListMixin(RDFSerializerMixin):
'''A Mixin for serializing containers into JSONLD format'''
child_attr = 'child'
with_cache = getattr(settings, 'SERIALIZER_CACHE', True)
def get_child(self):
return getattr(self, self.child_attr)
# converts primitive data representation to the representation used within our application
def to_internal_value(self, data):
try:
# if this is a container, the data will be stored in ldp:contains
data = data['ldp:contains']
except (TypeError, KeyError):
pass
if len(data) == 0:
return []
if isinstance(data, dict):
data = [data]
if isinstance(data, str) and data.startswith("http"):
data = [{'@id': data}]
return [getattr(self, self.child_attr).to_internal_value(item) for item in data]
def to_representation(self, value):
return {'@id': self.id,
'@type': 'ldp:Container',
'ldp:contains': super().to_representation(value),
'permissions': Model.get_permissions(value.model, self.context['request'].user, ['view', 'add'])
}
return [self.get_child().to_internal_value(item) for item in data]
def filter_queryset(self, queryset, child_model):
'''Applies the permission of the child model to the child queryset'''
view = copy(self.context['view'])
view.model = child_model
filter_backends = list({perm_class().get_filter_backend(child_model) for perm_class in
getattr(child_model._meta, 'permission_classes', []) if hasattr(perm_class(), 'get_filter_backend')})
for backend in filter_backends:
if backend:
queryset = backend().filter_queryset(self.context['request'], queryset, view)
return queryset
def compute_id(self, value):
'''generates the @id of the container'''
if not hasattr(self, 'parent_instance'):
#This is a container
return f"{settings.BASE_URL}{self.context['request'].path}"
return f"{settings.BASE_URL}{Model.resource_id(self.parent_instance)}{self.field_name}/"
def get_attribute(self, instance):
parent_id_field = self.parent.fields[self.parent.url_field_name]
context = self.parent.context
parent_id = parent_id_field.get_url(instance, parent_id_field.view_name, context['request'], context['format'])
self.id = parent_id + self.field_name + "/"
# save the parent object for nested field url
self.parent_instance = instance
return super().get_attribute(instance)
def check_cache(self, value, id, model, cache_vary):
'''Auxiliary function to avoid code duplication - checks cache and returns from it if it has entry'''
parent_meta = getattr(self.get_child(), 'Meta', getattr(self.parent, 'Meta', None))
depth = max(getattr(parent_meta, "depth", 0), 0) if parent_meta else 1
if depth:
# if the depth is greater than 0, we don't hit the cache, because a nested container might be outdated
# this Mixin may not have access to the depth of the parent serializer, e.g. if it's a ManyRelatedField
# in these cases we assume the depth is 0 and so we hit the cache
return None
cache_key = getattr(model._meta, 'label', None)
if self.with_cache and GLOBAL_SERIALIZER_CACHE.has(cache_key, id, cache_vary):
cache_value = GLOBAL_SERIALIZER_CACHE.get(cache_key, id, cache_vary)
# this check is to handle the situation where the cache has been invalidated by something we don't check
# namely if my permissions are upgraded then I may have access to view more objects
cache_under_value = cache_value['ldp:contains'] if 'ldp:contains' in cache_value else cache_value
if not hasattr(cache_under_value, '__len__') or not hasattr(value, '__len__') or (len(cache_under_value) == len(value)):
return cache_value
return False
def to_representation(self, value):
'''
Converts internal representation to primitive data representation
Filters objects out which I don't have permission to view
Permission on container :
- Can Add if add permission on contained object's type
- Can view the container is view permission on container model : container obj are filtered by view permission
'''
try:
child_model = self.get_child().Meta.model
except AttributeError:
child_model = value.model
user = self.context['request'].user
id = self.compute_id(value)
is_container = True
if getattr(self, 'parent', None): #If we're in a nested container
if isinstance(value, QuerySet) and getattr(self, 'parent', None):
value = self.filter_queryset(value, child_model)
if getattr(self, 'field_name', None) is not None:
if self.field_name in getattr(self.parent.Meta.model._meta, 'empty_containers', []):
return {'@id': id}
if not self.field_name in getattr(self.parent.Meta.model._meta, 'nested_fields', []):
is_container = False
cache_vary = str(user)
cache_result = self.check_cache(value, id, child_model, cache_vary)
if cache_result:
return cache_result
data = super().to_representation(value)
if is_container:
data = self.serialize_container(data, id, user, child_model)
GLOBAL_SERIALIZER_CACHE.set(getattr(child_model._meta, 'label'), id, cache_vary, data)
return GLOBAL_SERIALIZER_CACHE.get(getattr(child_model._meta, 'label'), id, cache_vary)
def get_value(self, dictionary):
try:
object_list = dictionary['@graph']
......@@ -104,35 +271,38 @@ class LDListMixin:
return obj
class IdentityFieldMixin:
def to_internal_value(self, data):
'''Gives the @id as a representation if present'''
try:
return super().to_internal_value(data[self.parent.url_field_name])
except (KeyError, TypeError):
return super().to_internal_value(data)
class ContainerSerializer(LDListMixin, ListSerializer):
class ContainerSerializer(LDListMixin, ListSerializer, IdentityFieldMixin):
id = ''
@property
def data(self):
return ReturnDict(super(ListSerializer, self).data, serializer=self)
def create(self, validated_data):
return super().create(validated_data)
def to_internal_value(self, data):
try:
return super().to_internal_value(data[self.parent.url_field_name])
except (KeyError, TypeError):
return super().to_internal_value(data)
class ManyJsonLdRelatedField(LDListMixin, ManyRelatedField):
child_attr = 'child_relation'
url_field_name = "@id"
class JsonLdField(HyperlinkedRelatedField):
class JsonLdField(HyperlinkedRelatedField, IdentityFieldMixin):
def __init__(self, view_name=None, **kwargs):
super().__init__(view_name, **kwargs)
self.get_lookup_args()
def get_url(self, obj, view_name, request, format):
'''Overridden from DRF to shortcut on urlid-holding objects'''
if hasattr(obj, 'urlid') and obj.urlid not in (None, ''):
return obj.urlid
return super().get_url(obj, view_name, request, format)
def get_lookup_args(self):
try:
lookup_field = get_resolver().reverse_dict[self.view_name][0][0][1][0]
......@@ -141,29 +311,25 @@ class JsonLdField(HyperlinkedRelatedField):
except MultiValueDictKeyError:
pass
def to_internal_value(self, data):
return super().to_internal_value(data)
def get_value(self, dictionary):
return super().get_value(dictionary)
class JsonLdRelatedField(JsonLdField, RDFSerializerMixin):
def use_pk_only_optimization(self):
return False
class JsonLdRelatedField(JsonLdField):
def to_representation(self, value):
try:
return {'@id': super().to_representation(value)}
include_context = False
if Model.is_external(value):
data = {'@id': value.urlid}
else:
include_context = True
data = {'@id': super().to_representation(value)}
return self.serialize_rdf_fields(value, data, include_context=include_context)
except ImproperlyConfigured:
return value.pk
def to_internal_value(self, data):
try:
return super().to_internal_value(data[self.parent.url_field_name])
except (KeyError, TypeError):
return super().to_internal_value(data)
@classmethod
def many_init(cls, *args, **kwargs):
list_kwargs = {'child_relation': cls(*args, **kwargs)}
list_kwargs = {'child_relation': cls(*args, **kwargs),}
for key in kwargs:
if key in MANY_RELATION_KWARGS:
list_kwargs[key] = kwargs[key]
......@@ -171,6 +337,7 @@ class JsonLdRelatedField(JsonLdField):
class JsonLdIdentityField(JsonLdField):
'''Represents an identity (url) field for a serializer'''
def __init__(self, view_name=None, **kwargs):
kwargs['read_only'] = True
kwargs['source'] = '*'
......@@ -179,64 +346,124 @@ class JsonLdIdentityField(JsonLdField):
def use_pk_only_optimization(self):
return False
def to_internal_value(self, data):
try:
return super().to_internal_value(data[self.parent.url_field_name])
except KeyError:
return super().to_internal_value(data)
def get_value(self, dictionary):
return super().get_value(dictionary)
def to_representation(self, value: Any) -> Any:
'''returns hyperlink representation of identity field'''
try:
return Hyperlink(value.webid(), value)
# we already have a url to return
if isinstance(value, str):
return Hyperlink(value, value)
# expecting a user instance. Compute the webid and return this in hyperlink format
else:
return Hyperlink(value.urlid, value)
except AttributeError:
return super().to_representation(value)
def get_attribute(self, instance):
if Model.is_external(instance):
return instance.urlid
else:
# runs DRF's RelatedField.get_attribute
# returns the pk only if optimised or the instance itself in the standard case
return super().get_attribute(instance)
class LDPSerializer(HyperlinkedModelSerializer):
class LDPSerializer(HyperlinkedModelSerializer, RDFSerializerMixin):
url_field_name = "@id"
serializer_related_field = JsonLdRelatedField
serializer_url_field = JsonLdIdentityField
ModelSerializer.serializer_field_mapping[LDPUrlField] = IdURLField
@property
def data(self):
return super().data
# The default serializer repr ends in infinite loop. Overloading it prevents that.
def __repr__(self):
return self.__class__.__name__
@cached_property
def fields(self):
"""
A dictionary of {field_name: field_instance}.
"""
# `fields` is evaluated lazily. We do this to ensure that we don't
# have issues importing modules that use ModelSerializers as fields,
# even if Django's app-loading stage has not yet run.
fields = BindingDict(self)
# we allow the request object to specify a subset of fields which should be serialized
model_fields = self.get_fields()
req_header_accept_shape = self.context['request'].META.get('HTTP_ACCEPT_MODEL_FIELDS') if 'request' in self.context else None
try:
allowed_fields = list(set(json.loads(req_header_accept_shape)).intersection(model_fields.keys())) if req_header_accept_shape is not None else model_fields.keys()
except json.decoder.JSONDecodeError:
raise ValidationError("Please send the HTTP header Accept-Model-Fields as an array of strings")
for key, value in model_fields.items():
if key in allowed_fields:
fields[key] = value
return fields
def get_default_field_names(self, declared_fields, model_info):
try:
fields = list(self.Meta.model._meta.serializer_fields)
except AttributeError:
fields = super().get_default_field_names(declared_fields, model_info)
if 'request' in self._context and not self._context['request']._request.method == 'GET':
try:
fields.remove(self.Meta.model._meta.auto_author)
except ValueError:
pass
except AttributeError:
pass
return fields + list(getattr(self.Meta, 'extra_fields', []))
def to_representation(self, obj):
data = super().to_representation(obj)
# external Models should only be returned with rdf values
if Model.is_external(obj):
data = {'@id': obj.urlid}
return self.serialize_rdf_fields(obj, data)
rdf_type = Model.get_meta(obj, 'rdf_type', None)
rdf_context = Model.get_meta(obj, 'rdf_context', None)
if rdf_type is not None:
data['@type'] = rdf_type
if rdf_context is not None:
data['@context'] = rdf_context
data['permissions'] = Model.get_permissions(obj, self.context['request'].user,
['view', 'change', 'control', 'delete'])
data = super().to_representation(obj)
slug_field = Model.slug_field(obj)
for field in data:
if isinstance(data[field], dict) and '@id' in data[field]:
data[field]['@id'] = data[field]['@id'].format(Model.container_id(obj), str(getattr(obj, slug_field)))
# prioritise urlid field over generated @id
if 'urlid' in data and data['urlid'] is not None:
data['@id'] = data.pop('urlid')['@id']
if not '@id' in data:
data['@id'] = '{}{}'.format(settings.SITE_URL, Model.resource(obj))
data = self.serialize_rdf_fields(obj, data, include_context=True)
data = self.add_permissions(data, self.context['request'].user, type(obj), obj=obj)
return data
def build_field(self, field_name, info, model_class, nested_depth):
nested_depth = self.compute_depth(nested_depth, model_class)
def build_property_field(self, field_name, model_class):
class JSonLDPropertyField(ReadOnlyField):
def to_representation(self, instance):
from djangoldp.views import LDPViewSet
if isinstance(instance, QuerySet):
model = instance.model
elif isinstance(instance, Model):
model = type(instance)
else:
return instance
depth = max(getattr(self.parent.Meta, "depth", 0) - 1, 0)
fields = ["@id"] if depth==0 else getattr(model._meta, 'serializer_fields', [])
serializer_generator = LDPViewSet(model=model, fields=fields, depth=depth,
lookup_field=getattr(model._meta, 'lookup_field', 'pk'),
permission_classes=getattr(model._meta, 'permission_classes', []),
nested_fields=getattr(model._meta, 'nested_fields', []))
serializer = serializer_generator.get_serializer_class()(context=self.parent.context)
if isinstance(instance, QuerySet):
id = '{}{}{}/'.format(settings.SITE_URL, '{}{}/', self.source)
children = [serializer.to_representation(item) for item in instance]
return self.parent.serialize_container(children, id, self.parent.context['request'].user, model)
else:
return serializer.to_representation(instance)
return JSonLDPropertyField, {}
return super().build_field(field_name, info, model_class, nested_depth)
def handle_value_object(self, value):
'''
In JSON-LD value-objects can be passed in, which store some context on the field passed. By overriding this
function you can react to this context on a field without overriding build_standard_field
'''
return value['@value']
def build_standard_field(self, field_name, model_field):
class JSonLDStandardField:
......@@ -247,29 +474,49 @@ class LDPSerializer(HyperlinkedModelSerializer):
super().__init__(**kwargs)
def get_value(self, dictionary):
if self.field_name == 'urlid':
self.field_name = '@id'
try:
object_list = dictionary["@graph"]
if self.parent.instance is None:
obj = next(filter(
lambda o: not hasattr(o, self.parent.url_field_name) or "./" in o[self.url_field_name],
lambda o: not self.parent.url_field_name in o or "./" in o[self.parent.url_field_name],
object_list))
return super().get_value(obj)
value = super().get_value(obj)
else:
resource_id = Model.resource_id(self.parent.instance)
obj = next(filter(lambda o: resource_id.lstrip('/') in o[self.parent.url_field_name], object_list))
return super().get_value(obj)
obj = next(
filter(lambda o: resource_id.lstrip('/') in o[self.parent.url_field_name], object_list))
value = super().get_value(obj)
except KeyError:
return super().get_value(dictionary)
value = super().get_value(dictionary)
if self.field_name == '@id' and value == './':
self.field_name = 'urlid'
return None
if isinstance(value, dict) and '@value' in value:
value = self.parent.handle_value_object(value)
return self.manage_empty(value)
def manage_empty(self, value):
if value == '' and self.allow_null:
# If the field is blank, and null is a valid value then
# determine if we should use null instead.
return '' if getattr(self, 'allow_blank', False) else None
elif value == '' and not self.required:
# If the field is blank, and emptiness is valid then
# determine if we should use emptiness instead.
return '' if getattr(self, 'allow_blank', False) else empty
return value
field_class, field_kwargs = super().build_standard_field(field_name, model_field)
field_kwargs['parent_view_name'] = '{}-list'.format(model_field.model._meta.object_name.lower())
return type(field_class.__name__ + 'Valued', (JSonLDStandardField, field_class), {}), field_kwargs
def build_nested_field(self, field_name, relation_info, nested_depth):
nested_depth = self.compute_depth(nested_depth, self.Meta.model)
class NestedLDPSerializer(self.__class__):
class Meta:
model = relation_info.related_model
depth = nested_depth - 1
......@@ -279,6 +526,8 @@ class LDPSerializer(HyperlinkedModelSerializer):
fields = '__all__'
def to_internal_value(self, data):
if data == '':
return ''
if self.url_field_name in data:
if not isinstance(data, Mapping):
message = self.error_messages['invalid'].format(
......@@ -290,8 +539,9 @@ class LDPSerializer(HyperlinkedModelSerializer):
ret = OrderedDict()
errors = OrderedDict()
fields = list(filter(lambda x: x.field_name in data, self._writable_fields))
# validate fields passed in the data
fields = list(filter(lambda x: x.field_name in data, self._writable_fields))
for field in fields:
validate_method = getattr(self, 'validate_' + field.field_name, None)
primitive_value = field.get_value(data)
......@@ -311,51 +561,78 @@ class LDPSerializer(HyperlinkedModelSerializer):
if errors:
raise ValidationError(errors)
# if it's a local resource - use the path to resolve the slug_field on the model
uri = data[self.url_field_name]
http_prefix = uri.startswith(('http:', 'https:'))
if not Model.is_external(uri):
http_prefix = uri.startswith(('http:', 'https:'))
if http_prefix:
uri = parse.urlparse(uri).path
prefix = get_script_prefix()
if uri.startswith(prefix):
uri = '/' + uri[len(prefix):]
if http_prefix:
uri = parse.urlparse(uri).path
prefix = get_script_prefix()
if uri.startswith(prefix):
uri = '/' + uri[len(prefix):]
try:
match = resolve(uri_to_iri(uri))
slug_field = Model.slug_field(self.__class__.Meta.model)
ret[slug_field] = match.kwargs[slug_field]
except Resolver404:
pass
try:
match = resolve(uri_to_iri(uri))
slug_field = Model.slug_field(self.__class__.Meta.model)
ret[slug_field] = match.kwargs[slug_field]
except Resolver404:
pass
if 'urlid' in data:
ret['urlid'] = data['urlid']
return ret
else:
return super().to_internal_value(data)
ret = super().to_internal_value(data)
# copy url_field_name value to urlid, if necessary
if self.url_field_name in data and not 'urlid' in data and data[self.url_field_name].startswith('http'):
ret['urlid'] = data[self.url_field_name]
return ret
kwargs = get_nested_relation_kwargs(relation_info)
kwargs['read_only'] = False
kwargs['required'] = False
return NestedLDPSerializer, kwargs
@classmethod
def compute_depth(cls, depth, model_class, name='depth'):
try:
model_depth = getattr(model_class._meta, 'depth', getattr(model_class.Meta, 'depth', 10))
depth = min(depth, int(model_depth))
except AttributeError:
depth = min(depth, int(getattr(model_class._meta, 'depth', 1)))
return depth
@classmethod
def many_init(cls, *args, **kwargs):
kwargs['child'] = cls(**kwargs)
try:
cls.Meta.depth = cls.compute_depth(kwargs['context']['view'].many_depth, cls.Meta.model, 'many_depth')
except KeyError:
pass
return ContainerSerializer(*args, **kwargs)
allow_empty = kwargs.pop('allow_empty', None)
child_serializer = cls(*args, **kwargs)
list_kwargs = {
'child': child_serializer,
}
if allow_empty is not None:
list_kwargs['allow_empty'] = allow_empty
list_kwargs.update({
key: value for key, value in kwargs.items()
if key in LIST_SERIALIZER_KWARGS
})
meta = getattr(cls, 'Meta', None)
list_serializer_class = getattr(meta, 'list_serializer_class', ContainerSerializer)
serializer = list_serializer_class(*args, **list_kwargs)
# if the child serializer has disabled the cache, really it means disable it on the container
if hasattr(child_serializer, 'with_cache'):
serializer.with_cache = child_serializer.with_cache
return serializer
def to_internal_value(self, data):
#TODO: This hack is needed because external users don't pass validation.
# Objects require all fields to be optional to be created as external, and username is required.
is_user_and_external = self.Meta.model is get_user_model() and '@id' in data and Model.is_external(data['@id'])
if is_user_and_external:
data['username'] = 'external'
ret = super().to_internal_value(data)
if is_user_and_external:
ret['urlid'] = data['@id']
ret.pop('username')
return ret
def get_value(self, dictionary):
'''overrides get_value to handle @graph key'''
try:
object_list = dictionary["@graph"]
if self.parent.instance is None:
......@@ -364,13 +641,15 @@ class LDPSerializer(HyperlinkedModelSerializer):
object_list))
else:
container_id = Model.container_id(self.parent.instance)
obj = next(filter(lambda o: container_id in o[self.url_field_name], object_list))
obj = next(filter(lambda o: container_id.lstrip('/') in o[self.url_field_name], object_list))
item = super().get_value(obj)
full_item = None
if item is empty:
return empty
try:
full_item = next(filter(lambda o: self.url_field_name in o and (item[self.url_field_name] == o[self.url_field_name]), object_list))
full_item = next(
filter(lambda o: self.url_field_name in o and (item[self.url_field_name] == o[self.url_field_name]),
object_list))
except StopIteration:
pass
if full_item is None:
......@@ -382,51 +661,69 @@ class LDPSerializer(HyperlinkedModelSerializer):
return super().get_value(dictionary)
def create(self, validated_data):
instance = self.internal_create(validated_data, model=self.Meta.model)
self.attach_related_object(instance, validated_data)
with transaction.atomic():
instance = self.internal_create(validated_data, model=self.Meta.model)
self.attach_related_object(instance, validated_data)
return instance
def attach_related_object(self, instance, validated_data):
'''adds m2m relations included in validated_data to the instance'''
model_class = self.Meta.model
info = model_meta.get_field_info(model_class)
many_to_many = {}
for field_name, relation_info in info.relations.items():
if relation_info.to_many and relation_info.reverse and not (
field_name in validated_data) and not field_name is None:
if relation_info.to_many and relation_info.reverse and not field_name is None:
rel = getattr(instance._meta.model, field_name).rel
if rel.name in validated_data:
related = validated_data[rel.name]
getattr(instance, field_name).add(related)
def internal_create(self, validated_data, model):
validated_data = self.resolve_fk_instances(model, validated_data, True)
nested_fk_fields_name = list(filter(lambda key: isinstance(validated_data[key], dict), validated_data))
for field_name in nested_fk_fields_name:
field_dict = validated_data[field_name]
field_model = getattr(model, field_name).field.rel.model
slug_field = Model.slug_field(field_model)
if slug_field in field_dict:
kwargs = {slug_field: field_dict[slug_field]}
sub_inst = field_model.objects.get(**kwargs)
else:
sub_inst = self.internal_create(field_dict, field_model )
validated_data[field_name] = sub_inst
# build tuples list of nested_field keys and their values. All list values are considered nested fields
nested_fields = []
nested_list_fields_name = list(filter(lambda key: isinstance(validated_data[key], list), validated_data))
for field_name in nested_list_fields_name:
nested_fields.append((field_name, validated_data.pop(field_name)))
info = model_meta.get_field_info(model)
many_to_many = []
one_to_one = {}
for field_name, relation_info in info.relations.items():
if relation_info.to_many and relation_info.reverse and (
field_name in validated_data) and not field_name is None:
many_to_many.append((field_name, validated_data.pop(field_name)))
elif relation_info.reverse and (field_name in validated_data) and not field_name is None:
one_to_one[field_name] = validated_data[field_name]
validated_data = self.remove_empty_value(validated_data)
if model is get_user_model() and not 'username' in validated_data:
validated_data['username'] = str(uuid.uuid4())
instance = model.objects.create(**validated_data)
for field_name, value in many_to_many:
validated_data[field_name] = value
if one_to_one:
for field_name, value in one_to_one.items():
setattr(instance, field_name, value)
value.save()
self.save_or_update_nested_list(instance, nested_fields)
return instance
def remove_empty_value(self, validated_data):
'''sets any empty strings in the validated_data to None'''
for attr, value in validated_data.items():
if value == '':
validated_data[attr] = None
return validated_data
def update(self, instance, validated_data):
model = self.Meta.model
nested_fields = []
nested_fields_name = list(filter(lambda key: isinstance(validated_data[key], list), validated_data))
for field_name in nested_fields_name:
......@@ -434,46 +731,144 @@ class LDPSerializer(HyperlinkedModelSerializer):
for attr, value in validated_data.items():
if isinstance(value, dict):
slug_field = Model.slug_field(instance)
manager = getattr(instance, attr)
if slug_field in value:
kwargs = {slug_field: value[slug_field]}
oldObj = manager._meta.model.objects.get(**kwargs)
value = self.update(instance=oldObj, validated_data=value)
else:
value = self.internal_create(validated_data=value, model=manager._meta.model)
setattr(instance, attr, value)
instance.save()
value = self.update_dict_value(attr, instance, value)
if value == '' and not isinstance(getattr(instance, attr), str):
setattr(instance, attr, None)
else:
setattr(instance, attr, value)
self.save_or_update_nested_list(instance, nested_fields)
instance.save()
return instance
def resolve_fk_instances(self, model, validated_data, create=False):
'''
iterates over every dict object in validated_data and resolves them into instances (get or create)
:param model: the model being operated on
:param validated_data: the data passed to the serializer
:param create: set to True, foreign keys will be created if they do not exist
'''
nested_fk_fields_name = list(filter(lambda key: isinstance(validated_data[key], dict), validated_data))
for field_name in nested_fk_fields_name:
field_dict = validated_data[field_name]
field_model = model._meta.get_field(field_name).related_model
slug_field = Model.slug_field(field_model)
sub_inst = None
if 'urlid' in field_dict:
# has urlid and is a local resource
model, sub_inst = self.get_inst_by_urlid(field_dict, field_model, model, slug_field, sub_inst)
# try slug field, assuming that this is a local resource
elif slug_field in field_dict:
kwargs = {slug_field: field_dict[slug_field]}
sub_inst = field_model.objects.get(**kwargs)
if sub_inst is None:
if create:
sub_inst = self.internal_create(field_dict, field_model)
else:
continue
validated_data[field_name] = sub_inst
return validated_data
def get_inst_by_urlid(self, field_dict, field_model, model, slug_field, sub_inst):
if parse.urlparse(settings.BASE_URL).netloc == parse.urlparse(field_dict['urlid']).netloc:
# try slug field if it exists
if slug_field in field_dict:
kwargs = {slug_field: field_dict[slug_field]}
sub_inst = field_model.objects.get(**kwargs)
else:
model, sub_inst = Model.resolve(field_dict['urlid'])
# remote resource - get backlinked copy
elif hasattr(field_model, 'urlid'):
sub_inst = Model.get_or_create_external(field_model, field_dict['urlid'])
return model, sub_inst
def update_dict_value(self, attr, instance, value):
info = model_meta.get_field_info(instance)
relation_info = info.relations.get(attr)
slug_field = Model.slug_field(relation_info.related_model)
if slug_field in value:
value = self.update_dict_value_when_id_is_provided(attr, instance, relation_info, slug_field, value)
else:
if 'urlid' in value:
if parse.urlparse(settings.BASE_URL).netloc == parse.urlparse(value['urlid']).netloc:
model, oldObj = Model.resolve(value['urlid'])
value = self.update(instance=oldObj, validated_data=value)
elif hasattr(relation_info.related_model, 'urlid'):
value = Model.get_or_create_external(relation_info.related_model, value['urlid'])
else:
value = self.update_dict_value_without_slug_field(attr, instance, relation_info, value)
return value
def update_dict_value_without_slug_field(self, attr, instance, relation_info, value):
if relation_info.to_many:
value = self.internal_create(validated_data=value, model=relation_info.related_model)
else:
rel = instance._meta.get_field(attr)
reverse_attr_name = rel.remote_field.name
many = rel.one_to_many or rel.many_to_many
if many:
value[reverse_attr_name] = [instance]
oldObj = rel.model.object.get(id=value['urlid'])
else:
value[reverse_attr_name] = instance
oldObj = getattr(instance, attr, None)
if oldObj is None:
value = self.internal_create(validated_data=value, model=relation_info.related_model)
else:
value = self.update(instance=oldObj, validated_data=value)
return value
def update_dict_value_when_id_is_provided(self, attr, instance, relation_info, slug_field, value):
kwargs = {slug_field: value[slug_field]}
if relation_info.to_many:
manager = getattr(instance, attr)
oldObj = manager._meta.model.objects.get(**kwargs)
else:
related_model = relation_info.related_model
oldObj = related_model.objects.get(**kwargs)
value = self.update(instance=oldObj, validated_data=value)
return value
def save_or_update_nested_list(self, instance, nested_fields):
for (field_name, data) in nested_fields:
manager = getattr(instance, field_name)
slug_field = Model.slug_field(instance)
field_model = manager.model
slug_field = Model.slug_field(field_model)
try:
item_pk_to_keep = list(map(lambda e: e[slug_field], filter(lambda x: slug_field in x, data)))
item_pk_to_keep = [obj_dict[slug_field] for obj_dict in data if slug_field in obj_dict]
except TypeError:
item_pk_to_keep = list(map(lambda e: getattr(e, slug_field), filter(lambda x: hasattr(x, slug_field), data)))
item_pk_to_keep = [getattr(obj, slug_field) for obj in data if hasattr(obj, slug_field)]
for item in list(manager.all()):
if not str(getattr(item, slug_field)) in item_pk_to_keep:
if getattr(manager, 'through', None) is None:
item.delete()
else:
manager.remove(item)
if hasattr(manager, 'through'):
manager.clear()
else:
manager.exclude(pk__in=item_pk_to_keep).delete()
for item in data:
if not isinstance(item, dict):
if isinstance(item, Model):
item.save()
saved_item = item
elif slug_field in item:
kwargs = {slug_field: item[slug_field]}
old_obj = manager.model.objects.get(**kwargs)
saved_item = self.update(instance=old_obj, validated_data=item)
saved_item = self.get_or_create(field_model, item, kwargs)
elif 'urlid' in item:
# has urlid and is a local resource
if not Model.is_external(item['urlid']):
model, old_obj = Model.resolve(item['urlid'])
if old_obj is not None:
saved_item = self.update(instance=old_obj, validated_data=item)
else:
saved_item = self.internal_create(validated_data=item, model=field_model)
# has urlid and is external resource
elif hasattr(field_model, 'urlid'):
kwargs = {'urlid': item['urlid']}
saved_item = self.get_or_create(field_model, item, kwargs)
else:
rel = getattr(instance._meta.model, field_name).rel
try:
......@@ -484,5 +879,15 @@ class LDPSerializer(HyperlinkedModelSerializer):
pass
saved_item = self.internal_create(validated_data=item, model=manager.model)
if getattr(manager, 'through', None) is not None and manager.through._meta.auto_created:
if hasattr(manager, 'through') and manager.through._meta.auto_created:
#First remove to avoid duplicates
manager.remove(saved_item)
manager.add(saved_item)
def get_or_create(self, field_model, item, kwargs):
try:
old_obj = field_model.objects.get(**kwargs)
saved_item = self.update(instance=old_obj, validated_data=item)
except field_model.DoesNotExist:
saved_item = self.internal_create(validated_data=item, model=field_model)
return saved_item
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>Swagger</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@3/swagger-ui.css">
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js"></script>
<script>
const ui = SwaggerUIBundle({
url: "{% url 'schema' %}",
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIBundle.SwaggerUIStandalonePreset
],
layout: "BaseLayout",
requestInterceptor: (request) => {
request.headers['X-CSRFToken'] = "{{ csrf_token }}"
return request;
}
})
</script>
</body>
</html>
\ No newline at end of file
"""
This module is meant to be used as a testing LDP package.
It contains configuration elements imported by a djangoldp-package
when the django server is setup.
"""
# define an extra variables
MYPACKAGEVAR = 'ok'
USE_I18N = False
# register an extra middleware
MIDDLEWARE = [
'djangoldp.tests.dummy.middleware.DummyMiddleware'
]
# register an extra installed app
INSTALLED_APPS = [
'djangoldp.tests.dummy.apps.DummyConfig'
]
SECRET_KEY = "$r&)p-4k@h5b!1yrft6&q%j)_p$lxqh6#)jeeu0z1iag&y&wdu"
from django.conf import settings
from django.conf.urls import url, include
from djangoldp.tests.models import Skill, JobOffer, Message, Conversation, Dummy
from django.urls import path
from djangoldp.tests.models import Message, Conversation, Dummy, PermissionlessDummy, Task, DateModel, LDPDummy
from djangoldp.permissions import ACLPermissions
from djangoldp.views import LDPViewSet
urlpatterns = [
url(r'^messages/', LDPViewSet.urls(model=Message, permission_classes=[], fields=["@id", "text", "conversation"], nested_fields=['conversation'])),
url(r'^conversations/', LDPViewSet.urls(model=Conversation, nested_fields=["message_set"], permission_classes=())),
url(r'^users/', LDPViewSet.urls(model=settings.AUTH_USER_MODEL, permission_classes=[])),
url(r'^dummys/', LDPViewSet.urls(model=Dummy, permission_classes=[], lookup_field='slug',)),
path('messages/', LDPViewSet.urls(model=Message, fields=["@id", "text", "conversation"], nested_fields=['conversation'])),
path('tasks/', LDPViewSet.urls(model=Task)),
path('conversations/', LDPViewSet.urls(model=Conversation, nested_fields=["message_set", "observers"])),
path('dummys/', LDPViewSet.urls(model=Dummy, lookup_field='slug',)),
path('permissionless-dummys/', LDPViewSet.urls(model=PermissionlessDummy, lookup_field='slug', permission_classes=[ACLPermissions])),
]
"""This module contains apps for testing."""
from django.apps import AppConfig
class DummyConfig(AppConfig):
# 'djangoldp.tests' is already registered as an installed app (it simulates a LDP package)
name = 'djangoldp.tests.dummy'
"""This module contains a dummy middleware for djangoldp testing."""
class DummyMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
[{"model": "djangoldp_notification.notification", "pk": 100, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 101, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 102, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 103, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 104, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 105, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 106, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 107, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 108, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 109, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 110, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 111, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 112, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 113, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 114, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 115, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 116, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 117, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 118, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 119, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 120, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 121, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 122, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 123, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 124, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 125, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 126, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 127, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 128, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 129, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 130, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 131, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 132, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 133, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 134, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 135, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 136, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 137, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 138, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 139, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 140, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 141, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 142, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 143, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 144, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 145, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 146, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 147, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 148, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 149, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 150, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 151, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 152, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 153, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 154, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 155, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 156, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 157, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 158, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 159, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 160, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 161, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 162, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 163, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 164, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 165, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 166, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 167, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 168, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 169, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 170, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 171, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 172, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 173, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 174, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 175, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 176, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 177, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 178, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 179, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 180, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 181, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 182, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 183, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 184, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 185, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 186, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 187, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 188, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 189, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 190, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 191, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 192, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 193, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 194, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 195, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 196, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 197, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 198, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 199, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}, {"model": "djangoldp_notification.notification", "pk": 200, "fields": {"user": "1", "author": "Test", "object": "http://localhost:8000/users/admin/", "type": "Update", "summary": "Test", "date": "2020-11-26"}}]
\ No newline at end of file
source diff could not be displayed: it is too large. Options to address this: view the blob.
[{"model": "tests.user", "pk": 0, "fields": {"username": "keith8874", "email": "jasonbeck2@example.net", "password": "glassonion", "first_name": "Dawn", "last_name": "Turner"}}, {"model": "tests.user", "pk": 1, "fields": {"username": "beasleytiffany90", "email": "haley605@example.org", "password": "glassonion", "first_name": "Debbie", "last_name": "Dunn"}}, {"model": "tests.user", "pk": 2, "fields": {"username": "kennethvega9", "email": "aguilarsarah0@example.net", "password": "glassonion", "first_name": "Jennifer", "last_name": "Saunders"}}, {"model": "tests.user", "pk": 3, "fields": {"username": "kimberlygreen99", "email": "campbelljames3@example.org", "password": "glassonion", "first_name": "Angela", "last_name": "Moore"}}, {"model": "tests.user", "pk": 4, "fields": {"username": "natalie7669", "email": "ehunt2@example.org", "password": "glassonion", "first_name": "Richard", "last_name": "Russo"}}, {"model": "tests.user", "pk": 5, "fields": {"username": "brookefuentes79", "email": "mcbridestephen1@example.com", "password": "glassonion", "first_name": "Timothy", "last_name": "Novak"}}, {"model": "tests.user", "pk": 6, "fields": {"username": "rhull25", "email": "millerkarl3@example.net", "password": "glassonion", "first_name": "Chelsea", "last_name": "Durham"}}, {"model": "tests.user", "pk": 7, "fields": {"username": "teresa654", "email": "qolson1@example.org", "password": "glassonion", "first_name": "Melissa", "last_name": "Howard"}}, {"model": "tests.user", "pk": 8, "fields": {"username": "wrightbrandy91", "email": "jamesdeanna1@example.org", "password": "glassonion", "first_name": "Martin", "last_name": "Nash"}}, {"model": "tests.user", "pk": 9, "fields": {"username": "adam7870", "email": "jonathan864@example.org", "password": "glassonion", "first_name": "Mary", "last_name": "Turner"}}, {"model": "tests.user", "pk": 10, "fields": {"username": "william6152", "email": "snichols4@example.net", "password": "glassonion", "first_name": "Jennifer", "last_name": "Nichols"}}, {"model": "tests.user", "pk": 11, "fields": {"username": "ashleyrodriguez17", "email": "claydarius2@example.net", "password": "glassonion", "first_name": "Courtney", "last_name": "Miller"}}, {"model": "tests.user", "pk": 12, "fields": {"username": "rbrown70", "email": "xcampbell1@example.org", "password": "glassonion", "first_name": "Spencer", "last_name": "Rodriguez"}}, {"model": "tests.user", "pk": 13, "fields": {"username": "joshua1230", "email": "robertabbott2@example.com", "password": "glassonion", "first_name": "Randall", "last_name": "Medina"}}, {"model": "tests.user", "pk": 14, "fields": {"username": "truiz71", "email": "wendy522@example.org", "password": "glassonion", "first_name": "Bruce", "last_name": "Alvarez"}}, {"model": "tests.user", "pk": 15, "fields": {"username": "zingram38", "email": "leah703@example.com", "password": "glassonion", "first_name": "Jesus", "last_name": "Novak"}}, {"model": "tests.user", "pk": 16, "fields": {"username": "vbrown41", "email": "hparsons0@example.net", "password": "glassonion", "first_name": "Charles", "last_name": "Mata"}}, {"model": "tests.user", "pk": 17, "fields": {"username": "harringtonbrittany82", "email": "kyle932@example.com", "password": "glassonion", "first_name": "Kevin", "last_name": "Martinez"}}, {"model": "tests.user", "pk": 18, "fields": {"username": "gerald1248", "email": "jordandavid0@example.com", "password": "glassonion", "first_name": "Tiffany", "last_name": "Sanchez"}}, {"model": "tests.user", "pk": 19, "fields": {"username": "ogreer82", "email": "jessica645@example.net", "password": "glassonion", "first_name": "Guy", "last_name": "Walker"}}, {"model": "tests.user", "pk": 20, "fields": {"username": "martinezmichael80", "email": "kevin155@example.com", "password": "glassonion", "first_name": "Steven", "last_name": "Griffith"}}, {"model": "tests.user", "pk": 21, "fields": {"username": "fwilliams33", "email": "raygabrielle5@example.com", "password": "glassonion", "first_name": "David", "last_name": "Thomas"}}, {"model": "tests.user", "pk": 22, "fields": {"username": "uandrade47", "email": "juliemiles4@example.net", "password": "glassonion", "first_name": "Nicole", "last_name": "Beltran"}}, {"model": "tests.user", "pk": 23, "fields": {"username": "todd9994", "email": "kevinrandall0@example.net", "password": "glassonion", "first_name": "Teresa", "last_name": "Webb"}}, {"model": "tests.user", "pk": 24, "fields": {"username": "brianjames17", "email": "rebeccanelson3@example.org", "password": "glassonion", "first_name": "Taylor", "last_name": "Summers"}}, {"model": "tests.user", "pk": 25, "fields": {"username": "franksutton63", "email": "jason465@example.org", "password": "glassonion", "first_name": "Jose", "last_name": "Eaton"}}, {"model": "tests.user", "pk": 26, "fields": {"username": "xjohnson65", "email": "elizabethsummers4@example.net", "password": "glassonion", "first_name": "Robin", "last_name": "Harper"}}, {"model": "tests.user", "pk": 27, "fields": {"username": "lauren1831", "email": "wrightmichael5@example.net", "password": "glassonion", "first_name": "Ivan", "last_name": "Villa"}}, {"model": "tests.user", "pk": 28, "fields": {"username": "aliciaspencer29", "email": "edwardskevin5@example.net", "password": "glassonion", "first_name": "Arthur", "last_name": "Munoz"}}, {"model": "tests.user", "pk": 29, "fields": {"username": "shelly8621", "email": "sharonbecker3@example.net", "password": "glassonion", "first_name": "Shannon", "last_name": "Goodman"}}, {"model": "tests.user", "pk": 30, "fields": {"username": "thompsonandrea45", "email": "bruiz2@example.org", "password": "glassonion", "first_name": "Michelle", "last_name": "Lowery"}}, {"model": "tests.user", "pk": 31, "fields": {"username": "jerry2890", "email": "masonjames4@example.com", "password": "glassonion", "first_name": "Amanda", "last_name": "Hicks"}}, {"model": "tests.user", "pk": 32, "fields": {"username": "james898", "email": "kimberly772@example.org", "password": "glassonion", "first_name": "William", "last_name": "Parker"}}, {"model": "tests.user", "pk": 33, "fields": {"username": "vbarry33", "email": "deborahsullivan3@example.org", "password": "glassonion", "first_name": "Dennis", "last_name": "Carson"}}, {"model": "tests.user", "pk": 34, "fields": {"username": "oturner45", "email": "cassandraschultz0@example.net", "password": "glassonion", "first_name": "Jeremy", "last_name": "Nichols"}}, {"model": "tests.user", "pk": 35, "fields": {"username": "holtgloria79", "email": "victoriajensen0@example.com", "password": "glassonion", "first_name": "Theresa", "last_name": "Sanders"}}, {"model": "tests.user", "pk": 36, "fields": {"username": "stanleyjeffrey4", "email": "michelledavis0@example.org", "password": "glassonion", "first_name": "Jake", "last_name": "Nelson"}}, {"model": "tests.user", "pk": 37, "fields": {"username": "pwaters39", "email": "stephanie584@example.com", "password": "glassonion", "first_name": "Justin", "last_name": "Hernandez"}}, {"model": "tests.user", "pk": 38, "fields": {"username": "wellsdonna66", "email": "thomasjo2@example.net", "password": "glassonion", "first_name": "Ronald", "last_name": "Vincent"}}, {"model": "tests.user", "pk": 39, "fields": {"username": "thomas3373", "email": "ashleylopez3@example.org", "password": "glassonion", "first_name": "Nicholas", "last_name": "Stewart"}}, {"model": "tests.user", "pk": 40, "fields": {"username": "qmullins31", "email": "shawna025@example.com", "password": "glassonion", "first_name": "Jason", "last_name": "Brennan"}}, {"model": "tests.user", "pk": 41, "fields": {"username": "nrodriguez19", "email": "kristypowell5@example.org", "password": "glassonion", "first_name": "Scott", "last_name": "Morris"}}, {"model": "tests.user", "pk": 42, "fields": {"username": "jeffreymyers85", "email": "deanbrandon4@example.net", "password": "glassonion", "first_name": "Christina", "last_name": "Lopez"}}, {"model": "tests.user", "pk": 43, "fields": {"username": "gloverryan37", "email": "tammy824@example.net", "password": "glassonion", "first_name": "Jamie", "last_name": "Brown"}}, {"model": "tests.user", "pk": 44, "fields": {"username": "williamsjacqueline96", "email": "reevesmorgan1@example.org", "password": "glassonion", "first_name": "Teresa", "last_name": "Clark"}}, {"model": "tests.user", "pk": 45, "fields": {"username": "kmartinez80", "email": "steven133@example.com", "password": "glassonion", "first_name": "Phyllis", "last_name": "Carter"}}, {"model": "tests.user", "pk": 46, "fields": {"username": "fschultz100", "email": "zoconnor1@example.org", "password": "glassonion", "first_name": "Scott", "last_name": "May"}}, {"model": "tests.user", "pk": 47, "fields": {"username": "briannamendoza85", "email": "bsmith1@example.com", "password": "glassonion", "first_name": "Brenda", "last_name": "Brooks"}}, {"model": "tests.user", "pk": 48, "fields": {"username": "grantnguyen95", "email": "lmyers5@example.net", "password": "glassonion", "first_name": "Matthew", "last_name": "Ryan"}}, {"model": "tests.user", "pk": 49, "fields": {"username": "sharon2539", "email": "melissa421@example.org", "password": "glassonion", "first_name": "Marvin", "last_name": "Taylor"}}, {"model": "tests.user", "pk": 50, "fields": {"username": "raymondberry40", "email": "jennifer725@example.org", "password": "glassonion", "first_name": "Tiffany", "last_name": "Terrell"}}, {"model": "tests.user", "pk": 51, "fields": {"username": "lunalisa62", "email": "marcusjones4@example.com", "password": "glassonion", "first_name": "Linda", "last_name": "Benson"}}, {"model": "tests.user", "pk": 52, "fields": {"username": "christineparrish51", "email": "qbriggs0@example.com", "password": "glassonion", "first_name": "Megan", "last_name": "Lindsey"}}, {"model": "tests.user", "pk": 53, "fields": {"username": "christopherbrown54", "email": "chaseheather4@example.com", "password": "glassonion", "first_name": "Lisa", "last_name": "Ruiz"}}, {"model": "tests.user", "pk": 54, "fields": {"username": "edominguez82", "email": "brandonluna3@example.com", "password": "glassonion", "first_name": "Michael", "last_name": "Middleton"}}, {"model": "tests.user", "pk": 55, "fields": {"username": "cheryl1280", "email": "urangel5@example.org", "password": "glassonion", "first_name": "Beth", "last_name": "Nelson"}}, {"model": "tests.user", "pk": 56, "fields": {"username": "akim51", "email": "amanda762@example.org", "password": "glassonion", "first_name": "Jacob", "last_name": "Ross"}}, {"model": "tests.user", "pk": 57, "fields": {"username": "lbrennan79", "email": "phillipssarah3@example.org", "password": "glassonion", "first_name": "James", "last_name": "Goodman"}}, {"model": "tests.user", "pk": 58, "fields": {"username": "njohnson86", "email": "wisejessica4@example.net", "password": "glassonion", "first_name": "Kimberly", "last_name": "Sullivan"}}, {"model": "tests.user", "pk": 59, "fields": {"username": "crystalblackburn62", "email": "aharrison0@example.org", "password": "glassonion", "first_name": "Rebecca", "last_name": "Clark"}}, {"model": "tests.user", "pk": 60, "fields": {"username": "ewingemily10", "email": "kylemarshall3@example.com", "password": "glassonion", "first_name": "Lauren", "last_name": "Franklin"}}, {"model": "tests.user", "pk": 61, "fields": {"username": "mcgeemichael45", "email": "matthewglover3@example.com", "password": "glassonion", "first_name": "Carlos", "last_name": "Allen"}}, {"model": "tests.user", "pk": 62, "fields": {"username": "jennifer5759", "email": "wrightcheryl2@example.com", "password": "glassonion", "first_name": "Christopher", "last_name": "Deleon"}}, {"model": "tests.user", "pk": 63, "fields": {"username": "collinsbryce3", "email": "rodriguezdonald2@example.com", "password": "glassonion", "first_name": "Brian", "last_name": "Gonzalez"}}, {"model": "tests.user", "pk": 64, "fields": {"username": "corey2414", "email": "phoover1@example.net", "password": "glassonion", "first_name": "Valerie", "last_name": "Hill"}}, {"model": "tests.user", "pk": 65, "fields": {"username": "hawkinsmary12", "email": "jpowell5@example.net", "password": "glassonion", "first_name": "George", "last_name": "Patton"}}, {"model": "tests.user", "pk": 66, "fields": {"username": "ericcollins85", "email": "bethallen0@example.net", "password": "glassonion", "first_name": "Miguel", "last_name": "Williams"}}, {"model": "tests.user", "pk": 67, "fields": {"username": "thomas1644", "email": "jessica113@example.org", "password": "glassonion", "first_name": "Elizabeth", "last_name": "Hale"}}, {"model": "tests.user", "pk": 68, "fields": {"username": "dawn0969", "email": "kaitlyn383@example.com", "password": "glassonion", "first_name": "Pamela", "last_name": "Walters"}}, {"model": "tests.user", "pk": 69, "fields": {"username": "benjamin0588", "email": "michael055@example.net", "password": "glassonion", "first_name": "Teresa", "last_name": "Howard"}}, {"model": "tests.user", "pk": 70, "fields": {"username": "allisonschneider2", "email": "zkoch4@example.com", "password": "glassonion", "first_name": "Deborah", "last_name": "Hubbard"}}, {"model": "tests.user", "pk": 71, "fields": {"username": "collierjason78", "email": "christinemartinez0@example.com", "password": "glassonion", "first_name": "Walter", "last_name": "Levy"}}, {"model": "tests.user", "pk": 72, "fields": {"username": "geraldreilly83", "email": "robertmcdonald3@example.org", "password": "glassonion", "first_name": "Matthew", "last_name": "Carr"}}, {"model": "tests.user", "pk": 73, "fields": {"username": "castillobrian10", "email": "lmarsh4@example.org", "password": "glassonion", "first_name": "Ashley", "last_name": "Edwards"}}, {"model": "tests.user", "pk": 74, "fields": {"username": "jjenkins86", "email": "heather485@example.net", "password": "glassonion", "first_name": "Cheryl", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 75, "fields": {"username": "eduardo1346", "email": "leahwalker0@example.org", "password": "glassonion", "first_name": "Veronica", "last_name": "Castro"}}, {"model": "tests.user", "pk": 76, "fields": {"username": "katie4732", "email": "toddrobinson0@example.net", "password": "glassonion", "first_name": "Carla", "last_name": "Keller"}}, {"model": "tests.user", "pk": 77, "fields": {"username": "derricklam74", "email": "michael921@example.com", "password": "glassonion", "first_name": "Lori", "last_name": "West"}}, {"model": "tests.user", "pk": 78, "fields": {"username": "monica9675", "email": "moodyalvin4@example.net", "password": "glassonion", "first_name": "George", "last_name": "Ellis"}}, {"model": "tests.user", "pk": 79, "fields": {"username": "andrewgibson28", "email": "christy604@example.net", "password": "glassonion", "first_name": "Stephen", "last_name": "Brown"}}, {"model": "tests.user", "pk": 80, "fields": {"username": "kayladougherty10", "email": "anita842@example.com", "password": "glassonion", "first_name": "Vickie", "last_name": "Ewing"}}, {"model": "tests.user", "pk": 81, "fields": {"username": "hansencorey15", "email": "jenkinsdaniel1@example.net", "password": "glassonion", "first_name": "Megan", "last_name": "Small"}}, {"model": "tests.user", "pk": 82, "fields": {"username": "john2321", "email": "ryan313@example.org", "password": "glassonion", "first_name": "Priscilla", "last_name": "Cook"}}, {"model": "tests.user", "pk": 83, "fields": {"username": "halecourtney87", "email": "cheryl774@example.com", "password": "glassonion", "first_name": "Brandon", "last_name": "Davis"}}, {"model": "tests.user", "pk": 84, "fields": {"username": "jamesjimenez91", "email": "ofreeman4@example.net", "password": "glassonion", "first_name": "Donald", "last_name": "Conner"}}, {"model": "tests.user", "pk": 85, "fields": {"username": "umarshall10", "email": "ngarcia0@example.org", "password": "glassonion", "first_name": "John", "last_name": "Rios"}}, {"model": "tests.user", "pk": 86, "fields": {"username": "hsosa19", "email": "davidharris5@example.org", "password": "glassonion", "first_name": "Michelle", "last_name": "Webster"}}, {"model": "tests.user", "pk": 87, "fields": {"username": "gabriellereid75", "email": "santoslori2@example.com", "password": "glassonion", "first_name": "Keith", "last_name": "Gordon"}}, {"model": "tests.user", "pk": 88, "fields": {"username": "perezrandall12", "email": "shannon652@example.net", "password": "glassonion", "first_name": "Lonnie", "last_name": "Pope"}}, {"model": "tests.user", "pk": 89, "fields": {"username": "jerryspencer10", "email": "jasonwhitehead0@example.org", "password": "glassonion", "first_name": "Christine", "last_name": "Stafford"}}, {"model": "tests.user", "pk": 90, "fields": {"username": "louis9079", "email": "edwardwilliams1@example.net", "password": "glassonion", "first_name": "Lindsay", "last_name": "Yates"}}, {"model": "tests.user", "pk": 91, "fields": {"username": "acostajohn60", "email": "donnablackwell1@example.net", "password": "glassonion", "first_name": "Michael", "last_name": "Wilson"}}, {"model": "tests.user", "pk": 92, "fields": {"username": "johnaguilar39", "email": "nataliewilson5@example.org", "password": "glassonion", "first_name": "Anne", "last_name": "Lopez"}}, {"model": "tests.user", "pk": 93, "fields": {"username": "zachary9282", "email": "brian073@example.net", "password": "glassonion", "first_name": "Sergio", "last_name": "Wells"}}, {"model": "tests.user", "pk": 94, "fields": {"username": "gina4286", "email": "caitlynblankenship5@example.org", "password": "glassonion", "first_name": "Tammy", "last_name": "Galvan"}}, {"model": "tests.user", "pk": 95, "fields": {"username": "zhangjustin65", "email": "rthomas2@example.net", "password": "glassonion", "first_name": "Christina", "last_name": "Holloway"}}, {"model": "tests.user", "pk": 96, "fields": {"username": "kennethcastro9", "email": "haley801@example.org", "password": "glassonion", "first_name": "Theresa", "last_name": "Ellis"}}, {"model": "tests.user", "pk": 97, "fields": {"username": "lleon28", "email": "francisdavid1@example.net", "password": "glassonion", "first_name": "Adrian", "last_name": "Mullen"}}, {"model": "tests.user", "pk": 98, "fields": {"username": "joe1275", "email": "bryan620@example.net", "password": "glassonion", "first_name": "Kyle", "last_name": "Wilson"}}, {"model": "tests.user", "pk": 99, "fields": {"username": "kathleen5952", "email": "theresa344@example.net", "password": "glassonion", "first_name": "Kevin", "last_name": "Barnett"}}, {"model": "tests.user", "pk": 100, "fields": {"username": "matthew5046", "email": "julia344@example.org", "password": "glassonion", "first_name": "Thomas", "last_name": "Cole"}}, {"model": "tests.user", "pk": 101, "fields": {"username": "vadams41", "email": "gpayne2@example.net", "password": "glassonion", "first_name": "Lisa", "last_name": "Spears"}}, {"model": "tests.user", "pk": 102, "fields": {"username": "lindapatrick40", "email": "jasonprice1@example.org", "password": "glassonion", "first_name": "Ruben", "last_name": "Gonzalez"}}, {"model": "tests.user", "pk": 103, "fields": {"username": "kathleen9476", "email": "clayton583@example.org", "password": "glassonion", "first_name": "David", "last_name": "Mcdowell"}}, {"model": "tests.user", "pk": 104, "fields": {"username": "havery24", "email": "parkererica0@example.net", "password": "glassonion", "first_name": "Ashley", "last_name": "Smith"}}, {"model": "tests.user", "pk": 105, "fields": {"username": "kyleharrison3", "email": "samuelgibson2@example.org", "password": "glassonion", "first_name": "Deborah", "last_name": "Lee"}}, {"model": "tests.user", "pk": 106, "fields": {"username": "lambertheather12", "email": "stephaniebest2@example.com", "password": "glassonion", "first_name": "Arthur", "last_name": "Cole"}}, {"model": "tests.user", "pk": 107, "fields": {"username": "robert1124", "email": "perrymary3@example.org", "password": "glassonion", "first_name": "Anthony", "last_name": "Taylor"}}, {"model": "tests.user", "pk": 108, "fields": {"username": "andersondiane86", "email": "randy445@example.org", "password": "glassonion", "first_name": "Alex", "last_name": "Austin"}}, {"model": "tests.user", "pk": 109, "fields": {"username": "evelyn4114", "email": "annlee1@example.net", "password": "glassonion", "first_name": "Steven", "last_name": "Alvarado"}}, {"model": "tests.user", "pk": 110, "fields": {"username": "heather209", "email": "wilsontravis4@example.com", "password": "glassonion", "first_name": "Brandon", "last_name": "Robbins"}}, {"model": "tests.user", "pk": 111, "fields": {"username": "james6756", "email": "woodstaylor0@example.net", "password": "glassonion", "first_name": "Rachel", "last_name": "Davies"}}, {"model": "tests.user", "pk": 112, "fields": {"username": "jeremy9011", "email": "ian391@example.net", "password": "glassonion", "first_name": "Alan", "last_name": "Mayo"}}, {"model": "tests.user", "pk": 113, "fields": {"username": "christinatate43", "email": "patricia232@example.org", "password": "glassonion", "first_name": "Brittany", "last_name": "Cowan"}}, {"model": "tests.user", "pk": 114, "fields": {"username": "wgonzales12", "email": "kellysuarez3@example.org", "password": "glassonion", "first_name": "Timothy", "last_name": "Jordan"}}, {"model": "tests.user", "pk": 115, "fields": {"username": "brittany1130", "email": "ebowman5@example.net", "password": "glassonion", "first_name": "Kathryn", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 116, "fields": {"username": "nashmelinda44", "email": "vconley1@example.net", "password": "glassonion", "first_name": "Lori", "last_name": "Adkins"}}, {"model": "tests.user", "pk": 117, "fields": {"username": "simmonsjanet16", "email": "franklinsara4@example.com", "password": "glassonion", "first_name": "Paul", "last_name": "Newman"}}, {"model": "tests.user", "pk": 118, "fields": {"username": "jarvislaura64", "email": "richardserik1@example.com", "password": "glassonion", "first_name": "Bobby", "last_name": "Young"}}, {"model": "tests.user", "pk": 119, "fields": {"username": "melissafrazier17", "email": "matthew994@example.org", "password": "glassonion", "first_name": "Amy", "last_name": "Gates"}}, {"model": "tests.user", "pk": 120, "fields": {"username": "kimberlyallen62", "email": "smithjack3@example.org", "password": "glassonion", "first_name": "Zachary", "last_name": "Soto"}}, {"model": "tests.user", "pk": 121, "fields": {"username": "frankramirez18", "email": "stoneolivia1@example.org", "password": "glassonion", "first_name": "Christine", "last_name": "Perez"}}, {"model": "tests.user", "pk": 122, "fields": {"username": "ashleewatkins50", "email": "turnerluis3@example.net", "password": "glassonion", "first_name": "Charles", "last_name": "Jones"}}, {"model": "tests.user", "pk": 123, "fields": {"username": "dana6915", "email": "frankreynolds5@example.net", "password": "glassonion", "first_name": "Sean", "last_name": "Everett"}}, {"model": "tests.user", "pk": 124, "fields": {"username": "barnettroy71", "email": "sharonwalker0@example.org", "password": "glassonion", "first_name": "Sharon", "last_name": "Lambert"}}, {"model": "tests.user", "pk": 125, "fields": {"username": "faithkane57", "email": "mannjason4@example.com", "password": "glassonion", "first_name": "Ashley", "last_name": "Pineda"}}, {"model": "tests.user", "pk": 126, "fields": {"username": "hcameron33", "email": "kirkvictoria4@example.com", "password": "glassonion", "first_name": "Matthew", "last_name": "King"}}, {"model": "tests.user", "pk": 127, "fields": {"username": "larsonrobert36", "email": "kaylamiller4@example.com", "password": "glassonion", "first_name": "Kelly", "last_name": "Thomas"}}, {"model": "tests.user", "pk": 128, "fields": {"username": "kevin1424", "email": "hamiltonjason1@example.net", "password": "glassonion", "first_name": "Heather", "last_name": "Spence"}}, {"model": "tests.user", "pk": 129, "fields": {"username": "michelle0726", "email": "mhoover2@example.net", "password": "glassonion", "first_name": "Isaac", "last_name": "Cuevas"}}, {"model": "tests.user", "pk": 130, "fields": {"username": "xwatson84", "email": "stevenpitts1@example.net", "password": "glassonion", "first_name": "Amber", "last_name": "Weaver"}}, {"model": "tests.user", "pk": 131, "fields": {"username": "rebecca4158", "email": "elizabeth684@example.net", "password": "glassonion", "first_name": "Charles", "last_name": "Grant"}}, {"model": "tests.user", "pk": 132, "fields": {"username": "hmason83", "email": "moraleschad3@example.org", "password": "glassonion", "first_name": "Jonathan", "last_name": "Chan"}}, {"model": "tests.user", "pk": 133, "fields": {"username": "kathleenhenderson94", "email": "michelle650@example.com", "password": "glassonion", "first_name": "Eric", "last_name": "Calhoun"}}, {"model": "tests.user", "pk": 134, "fields": {"username": "christinezhang22", "email": "justinwalters4@example.com", "password": "glassonion", "first_name": "Patricia", "last_name": "Pruitt"}}, {"model": "tests.user", "pk": 135, "fields": {"username": "gregorywinters30", "email": "dana595@example.com", "password": "glassonion", "first_name": "Robert", "last_name": "Zuniga"}}, {"model": "tests.user", "pk": 136, "fields": {"username": "dawnbrennan95", "email": "penny942@example.com", "password": "glassonion", "first_name": "Joseph", "last_name": "Gomez"}}, {"model": "tests.user", "pk": 137, "fields": {"username": "ashley1610", "email": "rebekah153@example.net", "password": "glassonion", "first_name": "Adrian", "last_name": "Calhoun"}}, {"model": "tests.user", "pk": 138, "fields": {"username": "harperbarbara59", "email": "houstonwilliam1@example.com", "password": "glassonion", "first_name": "Ebony", "last_name": "Oconnor"}}, {"model": "tests.user", "pk": 139, "fields": {"username": "kathryn0284", "email": "loriwilliams2@example.org", "password": "glassonion", "first_name": "Lindsey", "last_name": "Holmes"}}, {"model": "tests.user", "pk": 140, "fields": {"username": "cmullins0", "email": "pauljames2@example.com", "password": "glassonion", "first_name": "Melissa", "last_name": "Williams"}}, {"model": "tests.user", "pk": 141, "fields": {"username": "angelahooper74", "email": "martincarrie0@example.com", "password": "glassonion", "first_name": "Anthony", "last_name": "Jackson"}}, {"model": "tests.user", "pk": 142, "fields": {"username": "catherineclark50", "email": "brownjeffrey1@example.org", "password": "glassonion", "first_name": "Sergio", "last_name": "Hanson"}}, {"model": "tests.user", "pk": 143, "fields": {"username": "gayjorge48", "email": "emilycampbell4@example.net", "password": "glassonion", "first_name": "Brian", "last_name": "Bond"}}, {"model": "tests.user", "pk": 144, "fields": {"username": "jasonarnold16", "email": "michaela975@example.org", "password": "glassonion", "first_name": "Taylor", "last_name": "Stephens"}}, {"model": "tests.user", "pk": 145, "fields": {"username": "mknight2", "email": "jessicaknapp5@example.org", "password": "glassonion", "first_name": "Natasha", "last_name": "Morris"}}, {"model": "tests.user", "pk": 146, "fields": {"username": "webbnicole6", "email": "pbaldwin4@example.com", "password": "glassonion", "first_name": "Jessica", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 147, "fields": {"username": "rita4760", "email": "qpatterson2@example.org", "password": "glassonion", "first_name": "Rachel", "last_name": "Cooper"}}, {"model": "tests.user", "pk": 148, "fields": {"username": "staffordtyler89", "email": "susanwilliams4@example.org", "password": "glassonion", "first_name": "Jose", "last_name": "Farmer"}}, {"model": "tests.user", "pk": 149, "fields": {"username": "brownchristine55", "email": "fjenkins1@example.net", "password": "glassonion", "first_name": "Ashley", "last_name": "Hodges"}}, {"model": "tests.user", "pk": 150, "fields": {"username": "ooliver76", "email": "laurawatson2@example.org", "password": "glassonion", "first_name": "Suzanne", "last_name": "Faulkner"}}, {"model": "tests.user", "pk": 151, "fields": {"username": "wtorres63", "email": "boydcatherine5@example.net", "password": "glassonion", "first_name": "Michael", "last_name": "Caldwell"}}, {"model": "tests.user", "pk": 152, "fields": {"username": "louismurphy61", "email": "james894@example.com", "password": "glassonion", "first_name": "Aaron", "last_name": "Gutierrez"}}, {"model": "tests.user", "pk": 153, "fields": {"username": "parkshannon21", "email": "annfisher1@example.com", "password": "glassonion", "first_name": "Samuel", "last_name": "Hernandez"}}, {"model": "tests.user", "pk": 154, "fields": {"username": "danieladams92", "email": "daniel710@example.org", "password": "glassonion", "first_name": "Jason", "last_name": "Charles"}}, {"model": "tests.user", "pk": 155, "fields": {"username": "cheyenne6147", "email": "melissa582@example.com", "password": "glassonion", "first_name": "Andre", "last_name": "Burke"}}, {"model": "tests.user", "pk": 156, "fields": {"username": "joeellis74", "email": "nicole711@example.org", "password": "glassonion", "first_name": "William", "last_name": "Myers"}}, {"model": "tests.user", "pk": 157, "fields": {"username": "fpineda1", "email": "frankmatthew3@example.net", "password": "glassonion", "first_name": "Alexandra", "last_name": "Castillo"}}, {"model": "tests.user", "pk": 158, "fields": {"username": "franklin2039", "email": "murraygloria0@example.org", "password": "glassonion", "first_name": "John", "last_name": "Farmer"}}, {"model": "tests.user", "pk": 159, "fields": {"username": "hunteranthony23", "email": "cantrellkenneth4@example.com", "password": "glassonion", "first_name": "Rhonda", "last_name": "Hutchinson"}}, {"model": "tests.user", "pk": 160, "fields": {"username": "melissa6215", "email": "tbrown2@example.net", "password": "glassonion", "first_name": "Linda", "last_name": "Smith"}}, {"model": "tests.user", "pk": 161, "fields": {"username": "williamsmichael19", "email": "gboyer5@example.org", "password": "glassonion", "first_name": "Kevin", "last_name": "Kim"}}, {"model": "tests.user", "pk": 162, "fields": {"username": "prestonlauren35", "email": "ymason3@example.org", "password": "glassonion", "first_name": "Kenneth", "last_name": "Goodwin"}}, {"model": "tests.user", "pk": 163, "fields": {"username": "vargasrobert50", "email": "samuel563@example.org", "password": "glassonion", "first_name": "Jeffrey", "last_name": "Thomas"}}, {"model": "tests.user", "pk": 164, "fields": {"username": "dharris31", "email": "kevin705@example.com", "password": "glassonion", "first_name": "Kayla", "last_name": "Carson"}}, {"model": "tests.user", "pk": 165, "fields": {"username": "abigail7897", "email": "andrew921@example.net", "password": "glassonion", "first_name": "Sandra", "last_name": "Baker"}}, {"model": "tests.user", "pk": 166, "fields": {"username": "cartertimothy8", "email": "jscott0@example.org", "password": "glassonion", "first_name": "Michael", "last_name": "Dixon"}}, {"model": "tests.user", "pk": 167, "fields": {"username": "vcruz97", "email": "xbarrett0@example.com", "password": "glassonion", "first_name": "Victoria", "last_name": "Wilson"}}, {"model": "tests.user", "pk": 168, "fields": {"username": "pricegreg65", "email": "carlospham1@example.net", "password": "glassonion", "first_name": "Lisa", "last_name": "Tucker"}}, {"model": "tests.user", "pk": 169, "fields": {"username": "williammartinez19", "email": "gmartinez2@example.org", "password": "glassonion", "first_name": "Michelle", "last_name": "Smith"}}, {"model": "tests.user", "pk": 170, "fields": {"username": "rclark72", "email": "megantaylor5@example.com", "password": "glassonion", "first_name": "Melissa", "last_name": "Ramsey"}}, {"model": "tests.user", "pk": 171, "fields": {"username": "bhenderson53", "email": "swalker3@example.org", "password": "glassonion", "first_name": "Joseph", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 172, "fields": {"username": "qwalls96", "email": "erikabell5@example.com", "password": "glassonion", "first_name": "Elizabeth", "last_name": "Dudley"}}, {"model": "tests.user", "pk": 173, "fields": {"username": "larry4191", "email": "middletonsandra2@example.net", "password": "glassonion", "first_name": "Lori", "last_name": "Willis"}}, {"model": "tests.user", "pk": 174, "fields": {"username": "toddtorres27", "email": "jamestucker2@example.net", "password": "glassonion", "first_name": "Matthew", "last_name": "Holmes"}}, {"model": "tests.user", "pk": 175, "fields": {"username": "becky1583", "email": "ycurry1@example.org", "password": "glassonion", "first_name": "Beth", "last_name": "Beck"}}, {"model": "tests.user", "pk": 176, "fields": {"username": "yhall89", "email": "castilloraymond5@example.com", "password": "glassonion", "first_name": "Brandon", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 177, "fields": {"username": "fberry48", "email": "ashley300@example.com", "password": "glassonion", "first_name": "Felicia", "last_name": "Harris"}}, {"model": "tests.user", "pk": 178, "fields": {"username": "michaelbarnes79", "email": "lisa050@example.net", "password": "glassonion", "first_name": "Wesley", "last_name": "Walters"}}, {"model": "tests.user", "pk": 179, "fields": {"username": "kelsey832", "email": "wgriffith3@example.net", "password": "glassonion", "first_name": "Raymond", "last_name": "Chaney"}}, {"model": "tests.user", "pk": 180, "fields": {"username": "rodgersann72", "email": "andersonjohn5@example.com", "password": "glassonion", "first_name": "Jeffrey", "last_name": "Dean"}}, {"model": "tests.user", "pk": 181, "fields": {"username": "zwright80", "email": "jorge025@example.net", "password": "glassonion", "first_name": "Manuel", "last_name": "Reyes"}}, {"model": "tests.user", "pk": 182, "fields": {"username": "kevin7184", "email": "nhill4@example.com", "password": "glassonion", "first_name": "Nancy", "last_name": "Waters"}}, {"model": "tests.user", "pk": 183, "fields": {"username": "matthew7247", "email": "lawsonmartha2@example.net", "password": "glassonion", "first_name": "Kevin", "last_name": "Andrews"}}, {"model": "tests.user", "pk": 184, "fields": {"username": "scampbell97", "email": "davidharris0@example.net", "password": "glassonion", "first_name": "Valerie", "last_name": "Brooks"}}, {"model": "tests.user", "pk": 185, "fields": {"username": "amy2870", "email": "hernandezelizabeth2@example.org", "password": "glassonion", "first_name": "Benjamin", "last_name": "Alexander"}}, {"model": "tests.user", "pk": 186, "fields": {"username": "heathermeyer54", "email": "danieljohns4@example.com", "password": "glassonion", "first_name": "Elizabeth", "last_name": "Kim"}}, {"model": "tests.user", "pk": 187, "fields": {"username": "muellerbrooke4", "email": "wduke4@example.net", "password": "glassonion", "first_name": "Angela", "last_name": "Morris"}}, {"model": "tests.user", "pk": 188, "fields": {"username": "matthew9639", "email": "andreaperry2@example.com", "password": "glassonion", "first_name": "Erin", "last_name": "Clark"}}, {"model": "tests.user", "pk": 189, "fields": {"username": "rrichardson43", "email": "buckandrew4@example.com", "password": "glassonion", "first_name": "James", "last_name": "Hill"}}, {"model": "tests.user", "pk": 190, "fields": {"username": "pattonanthony79", "email": "beckmary2@example.com", "password": "glassonion", "first_name": "James", "last_name": "Cohen"}}, {"model": "tests.user", "pk": 191, "fields": {"username": "mercedes7026", "email": "rachel100@example.com", "password": "glassonion", "first_name": "Jill", "last_name": "Randolph"}}, {"model": "tests.user", "pk": 192, "fields": {"username": "jonessamantha53", "email": "sarah164@example.net", "password": "glassonion", "first_name": "Robert", "last_name": "Carey"}}, {"model": "tests.user", "pk": 193, "fields": {"username": "mbenson44", "email": "matthew191@example.org", "password": "glassonion", "first_name": "Christopher", "last_name": "Taylor"}}, {"model": "tests.user", "pk": 194, "fields": {"username": "oscar163", "email": "allison455@example.net", "password": "glassonion", "first_name": "Tara", "last_name": "Simpson"}}, {"model": "tests.user", "pk": 195, "fields": {"username": "jamescharles72", "email": "cory871@example.net", "password": "glassonion", "first_name": "Robert", "last_name": "Morse"}}, {"model": "tests.user", "pk": 196, "fields": {"username": "andrea3615", "email": "timothypatrick3@example.com", "password": "glassonion", "first_name": "Walter", "last_name": "Marquez"}}, {"model": "tests.user", "pk": 197, "fields": {"username": "annaodonnell12", "email": "michele523@example.net", "password": "glassonion", "first_name": "Bryan", "last_name": "Taylor"}}, {"model": "tests.user", "pk": 198, "fields": {"username": "pricejustin73", "email": "alicia110@example.com", "password": "glassonion", "first_name": "Brandon", "last_name": "Christensen"}}, {"model": "tests.user", "pk": 199, "fields": {"username": "dawsonjuan0", "email": "zrivera0@example.com", "password": "glassonion", "first_name": "Christopher", "last_name": "Ramirez"}}, {"model": "tests.user", "pk": 200, "fields": {"username": "harpervictoria63", "email": "qreed2@example.org", "password": "glassonion", "first_name": "Jonathan", "last_name": "Miller"}}, {"model": "tests.user", "pk": 201, "fields": {"username": "cortezkathleen24", "email": "elizabethmckenzie2@example.com", "password": "glassonion", "first_name": "Joseph", "last_name": "Norris"}}, {"model": "tests.user", "pk": 202, "fields": {"username": "blopez58", "email": "collinsmax1@example.org", "password": "glassonion", "first_name": "James", "last_name": "Mckee"}}, {"model": "tests.user", "pk": 203, "fields": {"username": "martin7518", "email": "faulknerneil2@example.com", "password": "glassonion", "first_name": "Shawn", "last_name": "Stevens"}}, {"model": "tests.user", "pk": 204, "fields": {"username": "jeremy8842", "email": "allenbenjamin4@example.com", "password": "glassonion", "first_name": "Timothy", "last_name": "Scott"}}, {"model": "tests.user", "pk": 205, "fields": {"username": "colleen722", "email": "thomaslopez4@example.com", "password": "glassonion", "first_name": "Joseph", "last_name": "Todd"}}, {"model": "tests.user", "pk": 206, "fields": {"username": "daniel3011", "email": "marvinprice2@example.org", "password": "glassonion", "first_name": "Marissa", "last_name": "Duran"}}, {"model": "tests.user", "pk": 207, "fields": {"username": "jeremy0912", "email": "lhumphrey0@example.com", "password": "glassonion", "first_name": "Courtney", "last_name": "Lee"}}, {"model": "tests.user", "pk": 208, "fields": {"username": "ejackson98", "email": "patrick624@example.org", "password": "glassonion", "first_name": "Chad", "last_name": "Stewart"}}, {"model": "tests.user", "pk": 209, "fields": {"username": "denisebowen13", "email": "cainsandra4@example.com", "password": "glassonion", "first_name": "Meredith", "last_name": "Middleton"}}, {"model": "tests.user", "pk": 210, "fields": {"username": "jonathan9156", "email": "erika681@example.com", "password": "glassonion", "first_name": "Daniel", "last_name": "Kaiser"}}, {"model": "tests.user", "pk": 211, "fields": {"username": "isaac3726", "email": "coxtina5@example.com", "password": "glassonion", "first_name": "Harry", "last_name": "Michael"}}, {"model": "tests.user", "pk": 212, "fields": {"username": "rossmichael37", "email": "zhernandez1@example.net", "password": "glassonion", "first_name": "Luis", "last_name": "Wagner"}}, {"model": "tests.user", "pk": 213, "fields": {"username": "powellscott91", "email": "higginsjacob3@example.com", "password": "glassonion", "first_name": "Brooke", "last_name": "Murray"}}, {"model": "tests.user", "pk": 214, "fields": {"username": "nicholskyle21", "email": "christopherjones2@example.com", "password": "glassonion", "first_name": "April", "last_name": "Shields"}}, {"model": "tests.user", "pk": 215, "fields": {"username": "jasmine7232", "email": "james404@example.org", "password": "glassonion", "first_name": "Jennifer", "last_name": "Gibson"}}, {"model": "tests.user", "pk": 216, "fields": {"username": "jwhite3", "email": "benjaminmoon3@example.org", "password": "glassonion", "first_name": "Zoe", "last_name": "Cole"}}, {"model": "tests.user", "pk": 217, "fields": {"username": "julietaylor76", "email": "george270@example.net", "password": "glassonion", "first_name": "Cynthia", "last_name": "Powers"}}, {"model": "tests.user", "pk": 218, "fields": {"username": "kochkyle81", "email": "mhall3@example.org", "password": "glassonion", "first_name": "Lacey", "last_name": "Daniels"}}, {"model": "tests.user", "pk": 219, "fields": {"username": "mariah5192", "email": "pcantrell0@example.com", "password": "glassonion", "first_name": "Beverly", "last_name": "Berry"}}, {"model": "tests.user", "pk": 220, "fields": {"username": "osanders76", "email": "copelandantonio0@example.org", "password": "glassonion", "first_name": "Dakota", "last_name": "Dunn"}}, {"model": "tests.user", "pk": 221, "fields": {"username": "smithandrew55", "email": "jonathoncummings5@example.com", "password": "glassonion", "first_name": "Tammy", "last_name": "Walton"}}, {"model": "tests.user", "pk": 222, "fields": {"username": "randy8999", "email": "zphillips1@example.org", "password": "glassonion", "first_name": "Brianna", "last_name": "Schmidt"}}, {"model": "tests.user", "pk": 223, "fields": {"username": "nixonmichael36", "email": "mirandatimothy2@example.net", "password": "glassonion", "first_name": "Sarah", "last_name": "Benitez"}}, {"model": "tests.user", "pk": 224, "fields": {"username": "pricekyle72", "email": "jgreer4@example.com", "password": "glassonion", "first_name": "Christian", "last_name": "Davis"}}, {"model": "tests.user", "pk": 225, "fields": {"username": "nathanwilliams96", "email": "wwatts5@example.org", "password": "glassonion", "first_name": "Matthew", "last_name": "Martinez"}}, {"model": "tests.user", "pk": 226, "fields": {"username": "eoliver88", "email": "rosariophilip4@example.com", "password": "glassonion", "first_name": "Troy", "last_name": "Walker"}}, {"model": "tests.user", "pk": 227, "fields": {"username": "uwells29", "email": "jeremiah824@example.com", "password": "glassonion", "first_name": "Jimmy", "last_name": "Jordan"}}, {"model": "tests.user", "pk": 228, "fields": {"username": "diane2221", "email": "danielleblair3@example.org", "password": "glassonion", "first_name": "Paul", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 229, "fields": {"username": "simsdavid22", "email": "ginagonzalez2@example.net", "password": "glassonion", "first_name": "Cory", "last_name": "Ellis"}}, {"model": "tests.user", "pk": 230, "fields": {"username": "patrickchristopher90", "email": "qdelgado0@example.net", "password": "glassonion", "first_name": "Gary", "last_name": "Cruz"}}, {"model": "tests.user", "pk": 231, "fields": {"username": "millerwilliam20", "email": "xwilliams1@example.net", "password": "glassonion", "first_name": "Benjamin", "last_name": "Clarke"}}, {"model": "tests.user", "pk": 232, "fields": {"username": "amy1278", "email": "hmoore4@example.com", "password": "glassonion", "first_name": "Dawn", "last_name": "Hunter"}}, {"model": "tests.user", "pk": 233, "fields": {"username": "kramirez83", "email": "victoria611@example.com", "password": "glassonion", "first_name": "Kevin", "last_name": "Frye"}}, {"model": "tests.user", "pk": 234, "fields": {"username": "michaelsmith18", "email": "pjohnson2@example.org", "password": "glassonion", "first_name": "Eric", "last_name": "Harris"}}, {"model": "tests.user", "pk": 235, "fields": {"username": "kevin32100", "email": "smithchristopher4@example.com", "password": "glassonion", "first_name": "Brian", "last_name": "Spears"}}, {"model": "tests.user", "pk": 236, "fields": {"username": "nancy6040", "email": "robert730@example.net", "password": "glassonion", "first_name": "Erika", "last_name": "Jones"}}, {"model": "tests.user", "pk": 237, "fields": {"username": "gmiller29", "email": "robert553@example.org", "password": "glassonion", "first_name": "Raymond", "last_name": "Edwards"}}, {"model": "tests.user", "pk": 238, "fields": {"username": "wwilson56", "email": "stephanie285@example.org", "password": "glassonion", "first_name": "Stacey", "last_name": "James"}}, {"model": "tests.user", "pk": 239, "fields": {"username": "daniel7839", "email": "stephenolson1@example.com", "password": "glassonion", "first_name": "Marissa", "last_name": "Anthony"}}, {"model": "tests.user", "pk": 240, "fields": {"username": "melindaowens89", "email": "brian422@example.org", "password": "glassonion", "first_name": "Kimberly", "last_name": "Shea"}}, {"model": "tests.user", "pk": 241, "fields": {"username": "mcbrideallison34", "email": "josehowe4@example.net", "password": "glassonion", "first_name": "Ryan", "last_name": "Porter"}}, {"model": "tests.user", "pk": 242, "fields": {"username": "jaredcarroll74", "email": "bmiller5@example.com", "password": "glassonion", "first_name": "Juan", "last_name": "Moore"}}, {"model": "tests.user", "pk": 243, "fields": {"username": "lisashaw87", "email": "xthomas3@example.com", "password": "glassonion", "first_name": "Katherine", "last_name": "Wagner"}}, {"model": "tests.user", "pk": 244, "fields": {"username": "monicaharris53", "email": "alicia172@example.com", "password": "glassonion", "first_name": "Zachary", "last_name": "Jones"}}, {"model": "tests.user", "pk": 245, "fields": {"username": "iroberts13", "email": "gbyrd4@example.com", "password": "glassonion", "first_name": "Julia", "last_name": "Gray"}}, {"model": "tests.user", "pk": 246, "fields": {"username": "lwright100", "email": "danielschultz0@example.org", "password": "glassonion", "first_name": "James", "last_name": "Guzman"}}, {"model": "tests.user", "pk": 247, "fields": {"username": "hcampos47", "email": "tkim2@example.org", "password": "glassonion", "first_name": "Jacqueline", "last_name": "Valentine"}}, {"model": "tests.user", "pk": 248, "fields": {"username": "courtneyrichardson18", "email": "james604@example.net", "password": "glassonion", "first_name": "Gregory", "last_name": "Harris"}}, {"model": "tests.user", "pk": 249, "fields": {"username": "mayosarah25", "email": "guy794@example.org", "password": "glassonion", "first_name": "Debbie", "last_name": "Hall"}}, {"model": "tests.user", "pk": 250, "fields": {"username": "vburgess89", "email": "christopher503@example.com", "password": "glassonion", "first_name": "Heather", "last_name": "Brown"}}, {"model": "tests.user", "pk": 251, "fields": {"username": "robert771", "email": "zdunn2@example.org", "password": "glassonion", "first_name": "David", "last_name": "Thomas"}}, {"model": "tests.user", "pk": 252, "fields": {"username": "lmaldonado86", "email": "vazquezdanielle5@example.com", "password": "glassonion", "first_name": "Amber", "last_name": "Simmons"}}, {"model": "tests.user", "pk": 253, "fields": {"username": "james0868", "email": "bhahn2@example.net", "password": "glassonion", "first_name": "Debra", "last_name": "Luna"}}, {"model": "tests.user", "pk": 254, "fields": {"username": "jacksonricardo97", "email": "stephenwright1@example.org", "password": "glassonion", "first_name": "Lance", "last_name": "Davies"}}, {"model": "tests.user", "pk": 255, "fields": {"username": "acontreras61", "email": "elizabeth051@example.com", "password": "glassonion", "first_name": "Jonathan", "last_name": "Alvarez"}}, {"model": "tests.user", "pk": 256, "fields": {"username": "alejandrajohnson96", "email": "murphyanna0@example.org", "password": "glassonion", "first_name": "Tamara", "last_name": "White"}}, {"model": "tests.user", "pk": 257, "fields": {"username": "kenneth0165", "email": "ashley163@example.net", "password": "glassonion", "first_name": "Sheila", "last_name": "Melendez"}}, {"model": "tests.user", "pk": 258, "fields": {"username": "aliciagarner6", "email": "prestonchavez2@example.net", "password": "glassonion", "first_name": "John", "last_name": "White"}}, {"model": "tests.user", "pk": 259, "fields": {"username": "felicia8949", "email": "bishopmary4@example.net", "password": "glassonion", "first_name": "Madison", "last_name": "Garrison"}}, {"model": "tests.user", "pk": 260, "fields": {"username": "srice0", "email": "cabreraderek1@example.org", "password": "glassonion", "first_name": "Rita", "last_name": "Bowman"}}, {"model": "tests.user", "pk": 261, "fields": {"username": "danielsmith56", "email": "lgonzalez0@example.net", "password": "glassonion", "first_name": "Luis", "last_name": "Lewis"}}, {"model": "tests.user", "pk": 262, "fields": {"username": "joseph8850", "email": "mendezpatrick3@example.net", "password": "glassonion", "first_name": "Michelle", "last_name": "Murray"}}, {"model": "tests.user", "pk": 263, "fields": {"username": "taylorcatherine49", "email": "eguzman0@example.com", "password": "glassonion", "first_name": "Tina", "last_name": "Bradley"}}, {"model": "tests.user", "pk": 264, "fields": {"username": "danielleschaefer61", "email": "angelaparker5@example.net", "password": "glassonion", "first_name": "Kerry", "last_name": "Schultz"}}, {"model": "tests.user", "pk": 265, "fields": {"username": "chris0997", "email": "nathan621@example.net", "password": "glassonion", "first_name": "Margaret", "last_name": "Ross"}}, {"model": "tests.user", "pk": 266, "fields": {"username": "justin6927", "email": "tina892@example.org", "password": "glassonion", "first_name": "Laurie", "last_name": "Lewis"}}, {"model": "tests.user", "pk": 267, "fields": {"username": "kpace94", "email": "graymond4@example.org", "password": "glassonion", "first_name": "Zachary", "last_name": "Davis"}}, {"model": "tests.user", "pk": 268, "fields": {"username": "rosebenjamin17", "email": "hware1@example.org", "password": "glassonion", "first_name": "Wanda", "last_name": "Beard"}}, {"model": "tests.user", "pk": 269, "fields": {"username": "cole8649", "email": "olivia215@example.com", "password": "glassonion", "first_name": "Dean", "last_name": "Russell"}}, {"model": "tests.user", "pk": 270, "fields": {"username": "sarah4385", "email": "rmccoy1@example.org", "password": "glassonion", "first_name": "Tim", "last_name": "Holt"}}, {"model": "tests.user", "pk": 271, "fields": {"username": "youngchristopher16", "email": "kristine562@example.com", "password": "glassonion", "first_name": "Carrie", "last_name": "Rowe"}}, {"model": "tests.user", "pk": 272, "fields": {"username": "llee58", "email": "teresadunn1@example.net", "password": "glassonion", "first_name": "Kyle", "last_name": "Rodriguez"}}, {"model": "tests.user", "pk": 273, "fields": {"username": "iadams49", "email": "merrittharold2@example.com", "password": "glassonion", "first_name": "Leonard", "last_name": "Anderson"}}, {"model": "tests.user", "pk": 274, "fields": {"username": "blynch0", "email": "hartgary0@example.com", "password": "glassonion", "first_name": "Mario", "last_name": "Lopez"}}, {"model": "tests.user", "pk": 275, "fields": {"username": "zcharles98", "email": "riverajessica3@example.org", "password": "glassonion", "first_name": "Karla", "last_name": "Mitchell"}}, {"model": "tests.user", "pk": 276, "fields": {"username": "andrea2053", "email": "christina411@example.com", "password": "glassonion", "first_name": "Frank", "last_name": "Hinton"}}, {"model": "tests.user", "pk": 277, "fields": {"username": "qdixon96", "email": "rpeterson5@example.com", "password": "glassonion", "first_name": "Samantha", "last_name": "Kline"}}, {"model": "tests.user", "pk": 278, "fields": {"username": "lawsonmatthew42", "email": "hursterica4@example.org", "password": "glassonion", "first_name": "Laura", "last_name": "Chen"}}, {"model": "tests.user", "pk": 279, "fields": {"username": "alyssacarroll19", "email": "gomezcarol2@example.net", "password": "glassonion", "first_name": "Christopher", "last_name": "Lewis"}}, {"model": "tests.user", "pk": 280, "fields": {"username": "thomasjimmy31", "email": "jasontanner5@example.com", "password": "glassonion", "first_name": "Judith", "last_name": "Daniels"}}, {"model": "tests.user", "pk": 281, "fields": {"username": "mcdanielapril12", "email": "jhenry1@example.com", "password": "glassonion", "first_name": "Amanda", "last_name": "Bolton"}}, {"model": "tests.user", "pk": 282, "fields": {"username": "joseph2555", "email": "debbie193@example.org", "password": "glassonion", "first_name": "Chad", "last_name": "Brady"}}, {"model": "tests.user", "pk": 283, "fields": {"username": "mortonbenjamin73", "email": "brandy225@example.org", "password": "glassonion", "first_name": "Pamela", "last_name": "Allen"}}, {"model": "tests.user", "pk": 284, "fields": {"username": "isherman79", "email": "ablair2@example.net", "password": "glassonion", "first_name": "Matthew", "last_name": "Freeman"}}, {"model": "tests.user", "pk": 285, "fields": {"username": "mblack93", "email": "gstevenson0@example.org", "password": "glassonion", "first_name": "Raymond", "last_name": "Oliver"}}, {"model": "tests.user", "pk": 286, "fields": {"username": "padillamary65", "email": "dustinfischer2@example.net", "password": "glassonion", "first_name": "Suzanne", "last_name": "Smith"}}, {"model": "tests.user", "pk": 287, "fields": {"username": "vsanders46", "email": "valeriewilliams5@example.org", "password": "glassonion", "first_name": "Deborah", "last_name": "Roberts"}}, {"model": "tests.user", "pk": 288, "fields": {"username": "danalandry77", "email": "williamsnicholas2@example.org", "password": "glassonion", "first_name": "Christy", "last_name": "Lynch"}}, {"model": "tests.user", "pk": 289, "fields": {"username": "kellercharles73", "email": "carpenterthomas2@example.org", "password": "glassonion", "first_name": "Amanda", "last_name": "Buchanan"}}, {"model": "tests.user", "pk": 290, "fields": {"username": "nsmith76", "email": "susangarcia5@example.com", "password": "glassonion", "first_name": "Andrew", "last_name": "Lara"}}, {"model": "tests.user", "pk": 291, "fields": {"username": "alvarezjeffrey97", "email": "stephaniewalton5@example.org", "password": "glassonion", "first_name": "Gabrielle", "last_name": "Campbell"}}, {"model": "tests.user", "pk": 292, "fields": {"username": "smithwhitney84", "email": "nhorn3@example.net", "password": "glassonion", "first_name": "Theresa", "last_name": "Mcclain"}}, {"model": "tests.user", "pk": 293, "fields": {"username": "destinymcbride95", "email": "melindagarner3@example.com", "password": "glassonion", "first_name": "Maria", "last_name": "Serrano"}}, {"model": "tests.user", "pk": 294, "fields": {"username": "tyler5557", "email": "tinahunt5@example.org", "password": "glassonion", "first_name": "Luis", "last_name": "Kim"}}, {"model": "tests.user", "pk": 295, "fields": {"username": "leonardthompson26", "email": "amanda311@example.org", "password": "glassonion", "first_name": "Connie", "last_name": "Cain"}}, {"model": "tests.user", "pk": 296, "fields": {"username": "adam7563", "email": "olsenamanda1@example.com", "password": "glassonion", "first_name": "Christy", "last_name": "Scott"}}, {"model": "tests.user", "pk": 297, "fields": {"username": "sshepherd30", "email": "mark420@example.com", "password": "glassonion", "first_name": "Maria", "last_name": "Walker"}}, {"model": "tests.user", "pk": 298, "fields": {"username": "ychaney86", "email": "amanda160@example.com", "password": "glassonion", "first_name": "Martin", "last_name": "Coffey"}}, {"model": "tests.user", "pk": 299, "fields": {"username": "joan6478", "email": "hgomez5@example.net", "password": "glassonion", "first_name": "Sarah", "last_name": "Cobb"}}, {"model": "tests.user", "pk": 300, "fields": {"username": "tmiller48", "email": "courtney860@example.org", "password": "glassonion", "first_name": "Courtney", "last_name": "Cox"}}, {"model": "tests.user", "pk": 301, "fields": {"username": "yrogers71", "email": "coreyadams5@example.com", "password": "glassonion", "first_name": "Sandra", "last_name": "Davis"}}, {"model": "tests.user", "pk": 302, "fields": {"username": "hilllorraine32", "email": "jtaylor3@example.org", "password": "glassonion", "first_name": "Courtney", "last_name": "Clark"}}, {"model": "tests.user", "pk": 303, "fields": {"username": "ryan2923", "email": "richard375@example.com", "password": "glassonion", "first_name": "William", "last_name": "Mitchell"}}, {"model": "tests.user", "pk": 304, "fields": {"username": "jasontran43", "email": "patrickholland0@example.net", "password": "glassonion", "first_name": "Caitlyn", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 305, "fields": {"username": "williamsjeffrey10", "email": "watkinsangela2@example.net", "password": "glassonion", "first_name": "Sarah", "last_name": "Edwards"}}, {"model": "tests.user", "pk": 306, "fields": {"username": "gschultz78", "email": "wsalinas2@example.com", "password": "glassonion", "first_name": "Adam", "last_name": "Stewart"}}, {"model": "tests.user", "pk": 307, "fields": {"username": "amanda7473", "email": "kevin893@example.org", "password": "glassonion", "first_name": "Levi", "last_name": "Clarke"}}, {"model": "tests.user", "pk": 308, "fields": {"username": "allisonyork75", "email": "cheryl302@example.com", "password": "glassonion", "first_name": "Terri", "last_name": "Ferrell"}}, {"model": "tests.user", "pk": 309, "fields": {"username": "mcclainrachael11", "email": "nnorman3@example.net", "password": "glassonion", "first_name": "Amy", "last_name": "Mullins"}}, {"model": "tests.user", "pk": 310, "fields": {"username": "osnyder6", "email": "lbrady4@example.org", "password": "glassonion", "first_name": "Sandra", "last_name": "Lindsey"}}, {"model": "tests.user", "pk": 311, "fields": {"username": "kathy0344", "email": "ffrederick0@example.org", "password": "glassonion", "first_name": "Christina", "last_name": "Smith"}}, {"model": "tests.user", "pk": 312, "fields": {"username": "wsingh81", "email": "alyssalane0@example.org", "password": "glassonion", "first_name": "Mason", "last_name": "Brewer"}}, {"model": "tests.user", "pk": 313, "fields": {"username": "william0691", "email": "erichall3@example.org", "password": "glassonion", "first_name": "Edwin", "last_name": "Lowe"}}, {"model": "tests.user", "pk": 314, "fields": {"username": "nmartinez2", "email": "smithtonya1@example.com", "password": "glassonion", "first_name": "Shelly", "last_name": "Knapp"}}, {"model": "tests.user", "pk": 315, "fields": {"username": "ucarrillo7", "email": "denniscrosby4@example.com", "password": "glassonion", "first_name": "Kelly", "last_name": "White"}}, {"model": "tests.user", "pk": 316, "fields": {"username": "pamela1588", "email": "lindsay645@example.net", "password": "glassonion", "first_name": "Joseph", "last_name": "Rasmussen"}}, {"model": "tests.user", "pk": 317, "fields": {"username": "jclark89", "email": "kennethgreen0@example.org", "password": "glassonion", "first_name": "Ashley", "last_name": "Boyd"}}, {"model": "tests.user", "pk": 318, "fields": {"username": "moralestracy60", "email": "richardsonkimberly4@example.net", "password": "glassonion", "first_name": "David", "last_name": "Richardson"}}, {"model": "tests.user", "pk": 319, "fields": {"username": "michaelsanchez51", "email": "michaeljohnson5@example.org", "password": "glassonion", "first_name": "Michael", "last_name": "Hill"}}, {"model": "tests.user", "pk": 320, "fields": {"username": "brownchristopher74", "email": "jamesthomas3@example.net", "password": "glassonion", "first_name": "Brian", "last_name": "Chambers"}}, {"model": "tests.user", "pk": 321, "fields": {"username": "davisaustin76", "email": "laurawhitaker3@example.com", "password": "glassonion", "first_name": "Bryan", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 322, "fields": {"username": "christophermaldonado74", "email": "josethompson2@example.net", "password": "glassonion", "first_name": "Denise", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 323, "fields": {"username": "parkermaria98", "email": "simmonsthomas0@example.net", "password": "glassonion", "first_name": "Darren", "last_name": "Oconnor"}}, {"model": "tests.user", "pk": 324, "fields": {"username": "lisamccarthy16", "email": "joseph413@example.net", "password": "glassonion", "first_name": "Heather", "last_name": "Chang"}}, {"model": "tests.user", "pk": 325, "fields": {"username": "jasonchoi38", "email": "hendersontina1@example.net", "password": "glassonion", "first_name": "Jennifer", "last_name": "Alexander"}}, {"model": "tests.user", "pk": 326, "fields": {"username": "wilcoxstephanie17", "email": "elizabethsnyder5@example.net", "password": "glassonion", "first_name": "Rose", "last_name": "Elliott"}}, {"model": "tests.user", "pk": 327, "fields": {"username": "jonathan625", "email": "kyle044@example.net", "password": "glassonion", "first_name": "Virginia", "last_name": "Cortez"}}, {"model": "tests.user", "pk": 328, "fields": {"username": "costamichelle20", "email": "bowmanelizabeth1@example.org", "password": "glassonion", "first_name": "Krista", "last_name": "Mueller"}}, {"model": "tests.user", "pk": 329, "fields": {"username": "morgan654", "email": "katiemunoz0@example.com", "password": "glassonion", "first_name": "Donna", "last_name": "Hubbard"}}, {"model": "tests.user", "pk": 330, "fields": {"username": "kelli0451", "email": "hansenashley5@example.net", "password": "glassonion", "first_name": "Jennifer", "last_name": "Gallegos"}}, {"model": "tests.user", "pk": 331, "fields": {"username": "millercarmen64", "email": "bakerjudy3@example.org", "password": "glassonion", "first_name": "David", "last_name": "Aguirre"}}, {"model": "tests.user", "pk": 332, "fields": {"username": "ericknapp53", "email": "jordan421@example.com", "password": "glassonion", "first_name": "Terri", "last_name": "Holland"}}, {"model": "tests.user", "pk": 333, "fields": {"username": "dhall48", "email": "pshaw0@example.org", "password": "glassonion", "first_name": "Sarah", "last_name": "Delacruz"}}, {"model": "tests.user", "pk": 334, "fields": {"username": "steven67100", "email": "charleswatts2@example.net", "password": "glassonion", "first_name": "Alexis", "last_name": "Frank"}}, {"model": "tests.user", "pk": 335, "fields": {"username": "vtaylor33", "email": "rbell0@example.com", "password": "glassonion", "first_name": "Savannah", "last_name": "Woods"}}, {"model": "tests.user", "pk": 336, "fields": {"username": "cummingschristopher22", "email": "davidlee5@example.org", "password": "glassonion", "first_name": "Maria", "last_name": "Garcia"}}, {"model": "tests.user", "pk": 337, "fields": {"username": "lsmith85", "email": "kyle192@example.net", "password": "glassonion", "first_name": "Alyssa", "last_name": "Gordon"}}, {"model": "tests.user", "pk": 338, "fields": {"username": "uwebb90", "email": "murrayjordan1@example.com", "password": "glassonion", "first_name": "Travis", "last_name": "Ramirez"}}, {"model": "tests.user", "pk": 339, "fields": {"username": "cynthia6981", "email": "vargasjulia0@example.net", "password": "glassonion", "first_name": "Andrew", "last_name": "Harmon"}}, {"model": "tests.user", "pk": 340, "fields": {"username": "ftorres38", "email": "emma664@example.net", "password": "glassonion", "first_name": "Carrie", "last_name": "Smith"}}, {"model": "tests.user", "pk": 341, "fields": {"username": "staceyruiz70", "email": "briannasnyder1@example.org", "password": "glassonion", "first_name": "Lisa", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 342, "fields": {"username": "bergerkimberly29", "email": "nicholas600@example.net", "password": "glassonion", "first_name": "Miguel", "last_name": "Santos"}}, {"model": "tests.user", "pk": 343, "fields": {"username": "alexis614", "email": "kyle131@example.com", "password": "glassonion", "first_name": "William", "last_name": "Hall"}}, {"model": "tests.user", "pk": 344, "fields": {"username": "michellemartinez58", "email": "melissabutler1@example.net", "password": "glassonion", "first_name": "Carrie", "last_name": "Cooley"}}, {"model": "tests.user", "pk": 345, "fields": {"username": "mcdonaldmichael36", "email": "alandelgado4@example.net", "password": "glassonion", "first_name": "Jane", "last_name": "Wright"}}, {"model": "tests.user", "pk": 346, "fields": {"username": "robert1976", "email": "savagerobert4@example.net", "password": "glassonion", "first_name": "George", "last_name": "Smith"}}, {"model": "tests.user", "pk": 347, "fields": {"username": "fedwards76", "email": "alanflores5@example.org", "password": "glassonion", "first_name": "Joshua", "last_name": "Long"}}, {"model": "tests.user", "pk": 348, "fields": {"username": "carlaphelps78", "email": "rstevens4@example.org", "password": "glassonion", "first_name": "Paul", "last_name": "Hayden"}}, {"model": "tests.user", "pk": 349, "fields": {"username": "crystal5045", "email": "hallkenneth0@example.org", "password": "glassonion", "first_name": "Ashley", "last_name": "Gonzalez"}}, {"model": "tests.user", "pk": 350, "fields": {"username": "edwardandrews38", "email": "zharris4@example.com", "password": "glassonion", "first_name": "Angela", "last_name": "Dickerson"}}, {"model": "tests.user", "pk": 351, "fields": {"username": "sherry8716", "email": "samantha945@example.org", "password": "glassonion", "first_name": "Joshua", "last_name": "Pittman"}}, {"model": "tests.user", "pk": 352, "fields": {"username": "janet6647", "email": "lesliehuff4@example.net", "password": "glassonion", "first_name": "Angela", "last_name": "Becker"}}, {"model": "tests.user", "pk": 353, "fields": {"username": "amy8073", "email": "perezbethany2@example.com", "password": "glassonion", "first_name": "Courtney", "last_name": "Patterson"}}, {"model": "tests.user", "pk": 354, "fields": {"username": "yfreeman31", "email": "beckerin0@example.org", "password": "glassonion", "first_name": "Stephanie", "last_name": "Townsend"}}, {"model": "tests.user", "pk": 355, "fields": {"username": "mendozalaura40", "email": "kathy255@example.net", "password": "glassonion", "first_name": "Amber", "last_name": "Wright"}}, {"model": "tests.user", "pk": 356, "fields": {"username": "oharrington57", "email": "turnersonia2@example.com", "password": "glassonion", "first_name": "Christopher", "last_name": "Pierce"}}, {"model": "tests.user", "pk": 357, "fields": {"username": "taylormichelle86", "email": "david673@example.com", "password": "glassonion", "first_name": "Caitlin", "last_name": "Tate"}}, {"model": "tests.user", "pk": 358, "fields": {"username": "moodynicholas17", "email": "jose795@example.com", "password": "glassonion", "first_name": "Keith", "last_name": "Taylor"}}, {"model": "tests.user", "pk": 359, "fields": {"username": "michellehall32", "email": "lcollins5@example.net", "password": "glassonion", "first_name": "Natasha", "last_name": "Moreno"}}, {"model": "tests.user", "pk": 360, "fields": {"username": "lisa312", "email": "hcarter1@example.org", "password": "glassonion", "first_name": "Alexandra", "last_name": "Baker"}}, {"model": "tests.user", "pk": 361, "fields": {"username": "vegaphyllis16", "email": "martintiffany0@example.org", "password": "glassonion", "first_name": "David", "last_name": "Sanchez"}}, {"model": "tests.user", "pk": 362, "fields": {"username": "jennifer7036", "email": "travislane0@example.com", "password": "glassonion", "first_name": "William", "last_name": "Griffith"}}, {"model": "tests.user", "pk": 363, "fields": {"username": "gallagherscott61", "email": "gardnerjames4@example.net", "password": "glassonion", "first_name": "Jeffrey", "last_name": "Robertson"}}, {"model": "tests.user", "pk": 364, "fields": {"username": "bruceshawn54", "email": "brandonsimon5@example.net", "password": "glassonion", "first_name": "Janet", "last_name": "Perez"}}, {"model": "tests.user", "pk": 365, "fields": {"username": "rachel4578", "email": "donnagross0@example.net", "password": "glassonion", "first_name": "Ronald", "last_name": "Archer"}}, {"model": "tests.user", "pk": 366, "fields": {"username": "anthony793", "email": "michaelaustin1@example.net", "password": "glassonion", "first_name": "Summer", "last_name": "Green"}}, {"model": "tests.user", "pk": 367, "fields": {"username": "christopher413", "email": "johnsonraymond1@example.net", "password": "glassonion", "first_name": "Michael", "last_name": "Duncan"}}, {"model": "tests.user", "pk": 368, "fields": {"username": "kevinbrown45", "email": "simmonsangela2@example.org", "password": "glassonion", "first_name": "James", "last_name": "Harrison"}}, {"model": "tests.user", "pk": 369, "fields": {"username": "tiffany4692", "email": "ritahubbard1@example.net", "password": "glassonion", "first_name": "Robert", "last_name": "Mason"}}, {"model": "tests.user", "pk": 370, "fields": {"username": "christinegarza57", "email": "angelaharris3@example.org", "password": "glassonion", "first_name": "Sean", "last_name": "Barnes"}}, {"model": "tests.user", "pk": 371, "fields": {"username": "andersonrebecca70", "email": "penningtonemily3@example.net", "password": "glassonion", "first_name": "Courtney", "last_name": "Parker"}}, {"model": "tests.user", "pk": 372, "fields": {"username": "maryhernandez81", "email": "bennettmark4@example.org", "password": "glassonion", "first_name": "Sally", "last_name": "Ford"}}, {"model": "tests.user", "pk": 373, "fields": {"username": "jared1318", "email": "gonzalezsandra3@example.net", "password": "glassonion", "first_name": "Maria", "last_name": "Ho"}}, {"model": "tests.user", "pk": 374, "fields": {"username": "jessica10100", "email": "egay2@example.org", "password": "glassonion", "first_name": "Maureen", "last_name": "Mitchell"}}, {"model": "tests.user", "pk": 375, "fields": {"username": "blackmichael95", "email": "lancelowe3@example.org", "password": "glassonion", "first_name": "Sonia", "last_name": "Cross"}}, {"model": "tests.user", "pk": 376, "fields": {"username": "hernandezdonna51", "email": "ibradley5@example.net", "password": "glassonion", "first_name": "William", "last_name": "Lowery"}}, {"model": "tests.user", "pk": 377, "fields": {"username": "acevedomichael25", "email": "emily553@example.net", "password": "glassonion", "first_name": "Crystal", "last_name": "Franklin"}}, {"model": "tests.user", "pk": 378, "fields": {"username": "terrihayes26", "email": "davisbryan3@example.org", "password": "glassonion", "first_name": "Nancy", "last_name": "Pratt"}}, {"model": "tests.user", "pk": 379, "fields": {"username": "stevekeith82", "email": "veronica924@example.org", "password": "glassonion", "first_name": "Brian", "last_name": "Smith"}}, {"model": "tests.user", "pk": 380, "fields": {"username": "scottalexander92", "email": "susanhansen1@example.net", "password": "glassonion", "first_name": "Victoria", "last_name": "Anderson"}}, {"model": "tests.user", "pk": 381, "fields": {"username": "estradawilliam78", "email": "smithvictor5@example.org", "password": "glassonion", "first_name": "Kelly", "last_name": "Harris"}}, {"model": "tests.user", "pk": 382, "fields": {"username": "ryanbird92", "email": "jessica281@example.net", "password": "glassonion", "first_name": "Michael", "last_name": "Blevins"}}, {"model": "tests.user", "pk": 383, "fields": {"username": "amberpearson49", "email": "snyderjacqueline4@example.net", "password": "glassonion", "first_name": "Helen", "last_name": "Garcia"}}, {"model": "tests.user", "pk": 384, "fields": {"username": "umaldonado54", "email": "chunter3@example.com", "password": "glassonion", "first_name": "Daniel", "last_name": "Smith"}}, {"model": "tests.user", "pk": 385, "fields": {"username": "cassandra0556", "email": "michellecooper4@example.org", "password": "glassonion", "first_name": "Nancy", "last_name": "Carr"}}, {"model": "tests.user", "pk": 386, "fields": {"username": "zriley55", "email": "katiewright2@example.org", "password": "glassonion", "first_name": "Gabrielle", "last_name": "Mullen"}}, {"model": "tests.user", "pk": 387, "fields": {"username": "gbradley50", "email": "roachdavid2@example.com", "password": "glassonion", "first_name": "Betty", "last_name": "Powell"}}, {"model": "tests.user", "pk": 388, "fields": {"username": "cantrellryan58", "email": "yaustin0@example.net", "password": "glassonion", "first_name": "Duane", "last_name": "Jackson"}}, {"model": "tests.user", "pk": 389, "fields": {"username": "debra2832", "email": "ibarrasarah3@example.com", "password": "glassonion", "first_name": "Richard", "last_name": "Torres"}}, {"model": "tests.user", "pk": 390, "fields": {"username": "vasquezallison72", "email": "paul415@example.com", "password": "glassonion", "first_name": "Richard", "last_name": "Brown"}}, {"model": "tests.user", "pk": 391, "fields": {"username": "ubarber77", "email": "jonesmichael3@example.org", "password": "glassonion", "first_name": "Thomas", "last_name": "Reynolds"}}, {"model": "tests.user", "pk": 392, "fields": {"username": "morganwilliam71", "email": "kelleydavid3@example.net", "password": "glassonion", "first_name": "Brenda", "last_name": "Estes"}}, {"model": "tests.user", "pk": 393, "fields": {"username": "simmonskaren29", "email": "jenniferhernandez0@example.com", "password": "glassonion", "first_name": "Carrie", "last_name": "Nguyen"}}, {"model": "tests.user", "pk": 394, "fields": {"username": "hernandezrebecca69", "email": "elliottkenneth3@example.com", "password": "glassonion", "first_name": "Heather", "last_name": "Watson"}}, {"model": "tests.user", "pk": 395, "fields": {"username": "tracy9888", "email": "elizabeth082@example.com", "password": "glassonion", "first_name": "Kimberly", "last_name": "Vazquez"}}, {"model": "tests.user", "pk": 396, "fields": {"username": "sbryant66", "email": "benjamindecker4@example.net", "password": "glassonion", "first_name": "Jessica", "last_name": "Allen"}}, {"model": "tests.user", "pk": 397, "fields": {"username": "carrieramirez58", "email": "wgutierrez3@example.net", "password": "glassonion", "first_name": "Christian", "last_name": "Reynolds"}}, {"model": "tests.user", "pk": 398, "fields": {"username": "glennrice81", "email": "jillthomas3@example.org", "password": "glassonion", "first_name": "Sandra", "last_name": "Tucker"}}, {"model": "tests.user", "pk": 399, "fields": {"username": "christopherallen19", "email": "erikalucas0@example.com", "password": "glassonion", "first_name": "Cody", "last_name": "Wood"}}, {"model": "tests.user", "pk": 400, "fields": {"username": "brittany6080", "email": "isaac214@example.net", "password": "glassonion", "first_name": "Micheal", "last_name": "Foster"}}, {"model": "tests.user", "pk": 401, "fields": {"username": "tiffany7578", "email": "mcclurejohnny1@example.org", "password": "glassonion", "first_name": "Timothy", "last_name": "Young"}}, {"model": "tests.user", "pk": 402, "fields": {"username": "hwilliams16", "email": "tracyroy2@example.com", "password": "glassonion", "first_name": "Sean", "last_name": "Avila"}}, {"model": "tests.user", "pk": 403, "fields": {"username": "whobbs71", "email": "alicia124@example.org", "password": "glassonion", "first_name": "Ashley", "last_name": "Duncan"}}, {"model": "tests.user", "pk": 404, "fields": {"username": "fhess33", "email": "stephensjodi1@example.com", "password": "glassonion", "first_name": "Tasha", "last_name": "Vasquez"}}, {"model": "tests.user", "pk": 405, "fields": {"username": "benderkristina59", "email": "sdavis3@example.com", "password": "glassonion", "first_name": "Jane", "last_name": "Gordon"}}, {"model": "tests.user", "pk": 406, "fields": {"username": "karen0432", "email": "sanchezryan3@example.com", "password": "glassonion", "first_name": "Kendra", "last_name": "Ellis"}}, {"model": "tests.user", "pk": 407, "fields": {"username": "jacobwatson24", "email": "fschmidt1@example.com", "password": "glassonion", "first_name": "Ryan", "last_name": "Levine"}}, {"model": "tests.user", "pk": 408, "fields": {"username": "dlowery50", "email": "fwalsh2@example.com", "password": "glassonion", "first_name": "Matthew", "last_name": "Santos"}}, {"model": "tests.user", "pk": 409, "fields": {"username": "cindygould87", "email": "alejandra893@example.org", "password": "glassonion", "first_name": "Kevin", "last_name": "Sanchez"}}, {"model": "tests.user", "pk": 410, "fields": {"username": "sharris30", "email": "brian951@example.net", "password": "glassonion", "first_name": "Tanya", "last_name": "Rivas"}}, {"model": "tests.user", "pk": 411, "fields": {"username": "arobinson15", "email": "qsanchez2@example.com", "password": "glassonion", "first_name": "Ryan", "last_name": "Garcia"}}, {"model": "tests.user", "pk": 412, "fields": {"username": "bairddonald42", "email": "chadsmith4@example.org", "password": "glassonion", "first_name": "Travis", "last_name": "Murray"}}, {"model": "tests.user", "pk": 413, "fields": {"username": "vharper76", "email": "aprilburgess4@example.net", "password": "glassonion", "first_name": "Karen", "last_name": "Armstrong"}}, {"model": "tests.user", "pk": 414, "fields": {"username": "rollinssamantha24", "email": "gilespatty2@example.com", "password": "glassonion", "first_name": "Kathryn", "last_name": "Miller"}}, {"model": "tests.user", "pk": 415, "fields": {"username": "xroth81", "email": "katherinegriffin0@example.com", "password": "glassonion", "first_name": "Brandy", "last_name": "Gordon"}}, {"model": "tests.user", "pk": 416, "fields": {"username": "jonescraig95", "email": "sonyacaldwell5@example.com", "password": "glassonion", "first_name": "Timothy", "last_name": "Webster"}}, {"model": "tests.user", "pk": 417, "fields": {"username": "byrdsusan24", "email": "vcordova2@example.org", "password": "glassonion", "first_name": "Daniel", "last_name": "Ruiz"}}, {"model": "tests.user", "pk": 418, "fields": {"username": "codybailey24", "email": "ztorres1@example.com", "password": "glassonion", "first_name": "Eric", "last_name": "Daniels"}}, {"model": "tests.user", "pk": 419, "fields": {"username": "moyerbrandon21", "email": "xburnett2@example.com", "password": "glassonion", "first_name": "Kristin", "last_name": "Mitchell"}}, {"model": "tests.user", "pk": 420, "fields": {"username": "mackenzie7516", "email": "mpalmer1@example.com", "password": "glassonion", "first_name": "Michelle", "last_name": "Holmes"}}, {"model": "tests.user", "pk": 421, "fields": {"username": "timothy5956", "email": "pthomas1@example.com", "password": "glassonion", "first_name": "Stephanie", "last_name": "Cobb"}}, {"model": "tests.user", "pk": 422, "fields": {"username": "lauradavis46", "email": "russell082@example.net", "password": "glassonion", "first_name": "Jennifer", "last_name": "Bernard"}}, {"model": "tests.user", "pk": 423, "fields": {"username": "erin7050", "email": "carriewyatt2@example.org", "password": "glassonion", "first_name": "Ashlee", "last_name": "Lynch"}}, {"model": "tests.user", "pk": 424, "fields": {"username": "millerdenise80", "email": "websteranne1@example.net", "password": "glassonion", "first_name": "Erin", "last_name": "Turner"}}, {"model": "tests.user", "pk": 425, "fields": {"username": "austintaylor69", "email": "carterjames0@example.com", "password": "glassonion", "first_name": "Martha", "last_name": "Collins"}}, {"model": "tests.user", "pk": 426, "fields": {"username": "tlewis94", "email": "lesliegarcia4@example.net", "password": "glassonion", "first_name": "Belinda", "last_name": "Armstrong"}}, {"model": "tests.user", "pk": 427, "fields": {"username": "alexa8286", "email": "tsweeney0@example.org", "password": "glassonion", "first_name": "Betty", "last_name": "Smith"}}, {"model": "tests.user", "pk": 428, "fields": {"username": "kjones51", "email": "kevinking1@example.net", "password": "glassonion", "first_name": "Stacy", "last_name": "Long"}}, {"model": "tests.user", "pk": 429, "fields": {"username": "hunttrevor8", "email": "joseph190@example.org", "password": "glassonion", "first_name": "Zachary", "last_name": "Thompson"}}, {"model": "tests.user", "pk": 430, "fields": {"username": "jenniferbaker35", "email": "pavila3@example.net", "password": "glassonion", "first_name": "Kelly", "last_name": "Rangel"}}, {"model": "tests.user", "pk": 431, "fields": {"username": "kennethscott23", "email": "acole3@example.net", "password": "glassonion", "first_name": "Rebecca", "last_name": "Rodriguez"}}, {"model": "tests.user", "pk": 432, "fields": {"username": "singletonbonnie48", "email": "patriciaphillips3@example.org", "password": "glassonion", "first_name": "Jennifer", "last_name": "Davis"}}, {"model": "tests.user", "pk": 433, "fields": {"username": "zdaugherty84", "email": "alyssahernandez4@example.com", "password": "glassonion", "first_name": "Jamie", "last_name": "Wilson"}}, {"model": "tests.user", "pk": 434, "fields": {"username": "nhaney22", "email": "speters0@example.com", "password": "glassonion", "first_name": "Louis", "last_name": "Vargas"}}, {"model": "tests.user", "pk": 435, "fields": {"username": "maxwelllori33", "email": "danielwatson3@example.net", "password": "glassonion", "first_name": "Tracy", "last_name": "Morris"}}, {"model": "tests.user", "pk": 436, "fields": {"username": "timothy6167", "email": "egomez2@example.com", "password": "glassonion", "first_name": "Erica", "last_name": "Le"}}, {"model": "tests.user", "pk": 437, "fields": {"username": "xmiller13", "email": "padillamark5@example.com", "password": "glassonion", "first_name": "Stacey", "last_name": "Mitchell"}}, {"model": "tests.user", "pk": 438, "fields": {"username": "greenenicole83", "email": "djones1@example.com", "password": "glassonion", "first_name": "Perry", "last_name": "Villarreal"}}, {"model": "tests.user", "pk": 439, "fields": {"username": "oclark26", "email": "santiagolauren2@example.net", "password": "glassonion", "first_name": "Michael", "last_name": "Palmer"}}, {"model": "tests.user", "pk": 440, "fields": {"username": "reyesjohn98", "email": "johngarcia4@example.net", "password": "glassonion", "first_name": "Emily", "last_name": "Padilla"}}, {"model": "tests.user", "pk": 441, "fields": {"username": "stricklandjamie17", "email": "chelsearodriguez3@example.com", "password": "glassonion", "first_name": "Steven", "last_name": "Frost"}}, {"model": "tests.user", "pk": 442, "fields": {"username": "gomezrichard63", "email": "reedlogan5@example.net", "password": "glassonion", "first_name": "Rebecca", "last_name": "Scott"}}, {"model": "tests.user", "pk": 443, "fields": {"username": "cindy0589", "email": "millergregory4@example.org", "password": "glassonion", "first_name": "Stephanie", "last_name": "Griffith"}}, {"model": "tests.user", "pk": 444, "fields": {"username": "wrightwanda38", "email": "lrivera0@example.com", "password": "glassonion", "first_name": "Brenda", "last_name": "Hart"}}, {"model": "tests.user", "pk": 445, "fields": {"username": "kbest26", "email": "parkerlaurie1@example.com", "password": "glassonion", "first_name": "Kenneth", "last_name": "Barrett"}}, {"model": "tests.user", "pk": 446, "fields": {"username": "rorozco47", "email": "andrea822@example.org", "password": "glassonion", "first_name": "Sara", "last_name": "Taylor"}}, {"model": "tests.user", "pk": 447, "fields": {"username": "maria6970", "email": "alexandra714@example.net", "password": "glassonion", "first_name": "John", "last_name": "Kerr"}}, {"model": "tests.user", "pk": 448, "fields": {"username": "tstevens25", "email": "charleshernandez1@example.net", "password": "glassonion", "first_name": "Melissa", "last_name": "Humphrey"}}, {"model": "tests.user", "pk": 449, "fields": {"username": "mary6497", "email": "savagepatrick4@example.org", "password": "glassonion", "first_name": "Shannon", "last_name": "Edwards"}}, {"model": "tests.user", "pk": 450, "fields": {"username": "carrie5723", "email": "jack615@example.com", "password": "glassonion", "first_name": "Courtney", "last_name": "Robinson"}}, {"model": "tests.user", "pk": 451, "fields": {"username": "kennethmosley64", "email": "paul372@example.net", "password": "glassonion", "first_name": "Andrea", "last_name": "Small"}}, {"model": "tests.user", "pk": 452, "fields": {"username": "jamesemily46", "email": "nrobinson3@example.org", "password": "glassonion", "first_name": "Jon", "last_name": "Willis"}}, {"model": "tests.user", "pk": 453, "fields": {"username": "brandon7374", "email": "ibush2@example.com", "password": "glassonion", "first_name": "Philip", "last_name": "Nelson"}}, {"model": "tests.user", "pk": 454, "fields": {"username": "gregorythornton86", "email": "rachael861@example.net", "password": "glassonion", "first_name": "Sherry", "last_name": "House"}}, {"model": "tests.user", "pk": 455, "fields": {"username": "tiffany6882", "email": "tyler615@example.net", "password": "glassonion", "first_name": "Cassandra", "last_name": "Tyler"}}, {"model": "tests.user", "pk": 456, "fields": {"username": "harveywendy83", "email": "vortiz4@example.com", "password": "glassonion", "first_name": "Charles", "last_name": "Woods"}}, {"model": "tests.user", "pk": 457, "fields": {"username": "michaeloconnor85", "email": "susanevans3@example.net", "password": "glassonion", "first_name": "Joshua", "last_name": "Flores"}}, {"model": "tests.user", "pk": 458, "fields": {"username": "nbrown21", "email": "fgordon5@example.net", "password": "glassonion", "first_name": "Nathan", "last_name": "Johnson"}}, {"model": "tests.user", "pk": 459, "fields": {"username": "dawnhutchinson73", "email": "kelliramsey1@example.net", "password": "glassonion", "first_name": "Rebecca", "last_name": "Levy"}}, {"model": "tests.user", "pk": 460, "fields": {"username": "ubates49", "email": "sheri953@example.net", "password": "glassonion", "first_name": "Jeanette", "last_name": "Green"}}, {"model": "tests.user", "pk": 461, "fields": {"username": "mitchellkenneth55", "email": "trichards2@example.com", "password": "glassonion", "first_name": "Michael", "last_name": "Moss"}}, {"model": "tests.user", "pk": 462, "fields": {"username": "brandon4755", "email": "jameswhite1@example.com", "password": "glassonion", "first_name": "Brianna", "last_name": "Neal"}}, {"model": "tests.user", "pk": 463, "fields": {"username": "alex4794", "email": "johnny215@example.com", "password": "glassonion", "first_name": "Karl", "last_name": "Woods"}}, {"model": "tests.user", "pk": 464, "fields": {"username": "tsingh37", "email": "ryan104@example.com", "password": "glassonion", "first_name": "Felicia", "last_name": "Miles"}}, {"model": "tests.user", "pk": 465, "fields": {"username": "james7694", "email": "tinajohnson3@example.org", "password": "glassonion", "first_name": "April", "last_name": "Aguilar"}}, {"model": "tests.user", "pk": 466, "fields": {"username": "swright30", "email": "diazdavid0@example.net", "password": "glassonion", "first_name": "Rose", "last_name": "Lewis"}}, {"model": "tests.user", "pk": 467, "fields": {"username": "vcastro88", "email": "mcphersonsusan1@example.org", "password": "glassonion", "first_name": "Melanie", "last_name": "Cole"}}, {"model": "tests.user", "pk": 468, "fields": {"username": "cristian8765", "email": "vanessa991@example.net", "password": "glassonion", "first_name": "Robert", "last_name": "Kim"}}, {"model": "tests.user", "pk": 469, "fields": {"username": "lcarlson5", "email": "ppeterson4@example.org", "password": "glassonion", "first_name": "John", "last_name": "Knight"}}, {"model": "tests.user", "pk": 470, "fields": {"username": "markwright88", "email": "samueldavenport3@example.org", "password": "glassonion", "first_name": "Craig", "last_name": "Smith"}}, {"model": "tests.user", "pk": 471, "fields": {"username": "bhowell35", "email": "rlester4@example.com", "password": "glassonion", "first_name": "Sheryl", "last_name": "Wallace"}}, {"model": "tests.user", "pk": 472, "fields": {"username": "edwardsaaron92", "email": "kyle351@example.org", "password": "glassonion", "first_name": "Kelly", "last_name": "Elliott"}}, {"model": "tests.user", "pk": 473, "fields": {"username": "kyliethomas15", "email": "taylormargaret0@example.net", "password": "glassonion", "first_name": "Jennifer", "last_name": "Allen"}}, {"model": "tests.user", "pk": 474, "fields": {"username": "nicolefarmer10", "email": "petersdevin2@example.net", "password": "glassonion", "first_name": "Mark", "last_name": "Savage"}}, {"model": "tests.user", "pk": 475, "fields": {"username": "upeck29", "email": "ajones3@example.com", "password": "glassonion", "first_name": "Samuel", "last_name": "Shaw"}}, {"model": "tests.user", "pk": 476, "fields": {"username": "pguerrero14", "email": "markpitts4@example.net", "password": "glassonion", "first_name": "Diane", "last_name": "Powell"}}, {"model": "tests.user", "pk": 477, "fields": {"username": "david8496", "email": "thomascallahan4@example.com", "password": "glassonion", "first_name": "Matthew", "last_name": "Delacruz"}}, {"model": "tests.user", "pk": 478, "fields": {"username": "dianecarlson84", "email": "kevin270@example.com", "password": "glassonion", "first_name": "Stephanie", "last_name": "Bryan"}}, {"model": "tests.user", "pk": 479, "fields": {"username": "timothyhampton32", "email": "slynn4@example.com", "password": "glassonion", "first_name": "Mary", "last_name": "Ruiz"}}, {"model": "tests.user", "pk": 480, "fields": {"username": "shannonberg67", "email": "howardkaren3@example.org", "password": "glassonion", "first_name": "Patricia", "last_name": "Jackson"}}, {"model": "tests.user", "pk": 481, "fields": {"username": "curtisjones66", "email": "frazierlance5@example.org", "password": "glassonion", "first_name": "Sherry", "last_name": "Rice"}}, {"model": "tests.user", "pk": 482, "fields": {"username": "parsonsjennifer87", "email": "bramsey5@example.org", "password": "glassonion", "first_name": "Jessica", "last_name": "Porter"}}, {"model": "tests.user", "pk": 483, "fields": {"username": "samuel9156", "email": "elizabeth024@example.com", "password": "glassonion", "first_name": "David", "last_name": "Bennett"}}, {"model": "tests.user", "pk": 484, "fields": {"username": "jason9011", "email": "karen515@example.net", "password": "glassonion", "first_name": "Mariah", "last_name": "Hood"}}, {"model": "tests.user", "pk": 485, "fields": {"username": "ruizjamie98", "email": "lydia433@example.com", "password": "glassonion", "first_name": "Pamela", "last_name": "Martinez"}}, {"model": "tests.user", "pk": 486, "fields": {"username": "pinedaalexis70", "email": "larsonbrett2@example.org", "password": "glassonion", "first_name": "Crystal", "last_name": "Erickson"}}, {"model": "tests.user", "pk": 487, "fields": {"username": "rileyashley73", "email": "josephglenn2@example.net", "password": "glassonion", "first_name": "James", "last_name": "Diaz"}}, {"model": "tests.user", "pk": 488, "fields": {"username": "anthonywoods25", "email": "john121@example.net", "password": "glassonion", "first_name": "Kelly", "last_name": "Smith"}}, {"model": "tests.user", "pk": 489, "fields": {"username": "morganmelissa59", "email": "qmartin4@example.net", "password": "glassonion", "first_name": "John", "last_name": "Davis"}}, {"model": "tests.user", "pk": 490, "fields": {"username": "fheath99", "email": "rebecca151@example.net", "password": "glassonion", "first_name": "Jeffrey", "last_name": "Vincent"}}, {"model": "tests.user", "pk": 491, "fields": {"username": "valenzuelajessica63", "email": "nelsonkim5@example.org", "password": "glassonion", "first_name": "Michele", "last_name": "Navarro"}}, {"model": "tests.user", "pk": 492, "fields": {"username": "ray2469", "email": "erinbrowning5@example.org", "password": "glassonion", "first_name": "Brian", "last_name": "Chambers"}}, {"model": "tests.user", "pk": 493, "fields": {"username": "pbryant44", "email": "victoriaadams4@example.net", "password": "glassonion", "first_name": "Katherine", "last_name": "Crawford"}}, {"model": "tests.user", "pk": 494, "fields": {"username": "ywilliams93", "email": "crystal144@example.org", "password": "glassonion", "first_name": "Jacqueline", "last_name": "Brown"}}, {"model": "tests.user", "pk": 495, "fields": {"username": "chelseasantana97", "email": "grimeslori1@example.com", "password": "glassonion", "first_name": "Tara", "last_name": "Cruz"}}, {"model": "tests.user", "pk": 496, "fields": {"username": "sandersedward21", "email": "rodriguezcorey5@example.com", "password": "glassonion", "first_name": "Oscar", "last_name": "Carter"}}, {"model": "tests.user", "pk": 497, "fields": {"username": "abrown66", "email": "fritzamanda4@example.net", "password": "glassonion", "first_name": "Sharon", "last_name": "Stein"}}, {"model": "tests.user", "pk": 498, "fields": {"username": "kshaw6", "email": "juliewade1@example.net", "password": "glassonion", "first_name": "Michael", "last_name": "Jones"}}, {"model": "tests.user", "pk": 499, "fields": {"username": "martinezjason100", "email": "rose562@example.net", "password": "glassonion", "first_name": "William", "last_name": "Oconnor"}}, {"model": "tests.project", "pk": 0, "fields": {"status": "Public", "description": "Test"}, "members": [287, 288, 289, 290, 291, 292, 293, 294, 295]}, {"model": "tests.project", "pk": 1, "fields": {"status": "Public", "description": "Test"}, "members": [266, 267, 268, 269, 270, 271]}, {"model": "tests.project", "pk": 2, "fields": {"status": "Public", "description": "Test"}, "members": [38, 39, 40, 41, 42, 43, 44, 45, 46]}, {"model": "tests.project", "pk": 3, "fields": {"status": "Public", "description": "Test"}, "members": [125, 126, 127, 128]}, {"model": "tests.project", "pk": 4, "fields": {"status": "Public", "description": "Test"}, "members": [274, 275, 276, 277, 278, 279]}, {"model": "tests.project", "pk": 5, "fields": {"status": "Public", "description": "Test"}, "members": [159, 160, 161, 162, 163, 164, 165, 166]}, {"model": "tests.project", "pk": 6, "fields": {"status": "Public", "description": "Test"}, "members": [417, 418, 419, 420, 421, 422, 423]}, {"model": "tests.project", "pk": 7, "fields": {"status": "Public", "description": "Test"}, "members": [313, 314, 315, 316, 317, 318, 319, 320]}, {"model": "tests.project", "pk": 8, "fields": {"status": "Public", "description": "Test"}, "members": [259, 260, 261, 262, 263, 264, 265]}, {"model": "tests.project", "pk": 9, "fields": {"status": "Public", "description": "Test"}, "members": [202, 203, 204, 205]}, {"model": "tests.project", "pk": 10, "fields": {"status": "Public", "description": "Test"}, "members": [18, 19, 20, 21]}, {"model": "tests.project", "pk": 11, "fields": {"status": "Public", "description": "Test"}, "members": [421, 422, 423, 424, 425, 426, 427, 428]}, {"model": "tests.project", "pk": 12, "fields": {"status": "Public", "description": "Test"}, "members": [261, 262, 263, 264, 265, 266, 267, 268, 269, 270]}, {"model": "tests.project", "pk": 13, "fields": {"status": "Public", "description": "Test"}, "members": [234, 235, 236, 237, 238, 239, 240, 241]}, {"model": "tests.project", "pk": 14, "fields": {"status": "Public", "description": "Test"}, "members": [338]}, {"model": "tests.project", "pk": 15, "fields": {"status": "Public", "description": "Test"}, "members": [316, 317, 318, 319, 320, 321, 322, 323]}, {"model": "tests.project", "pk": 16, "fields": {"status": "Public", "description": "Test"}, "members": [124, 125, 126, 127, 128, 129, 130, 131, 132, 133]}, {"model": "tests.project", "pk": 17, "fields": {"status": "Public", "description": "Test"}, "members": [246, 247, 248, 249, 250, 251, 252]}, {"model": "tests.project", "pk": 18, "fields": {"status": "Public", "description": "Test"}, "members": [348, 349, 350, 351, 352, 353]}, {"model": "tests.project", "pk": 19, "fields": {"status": "Public", "description": "Test"}, "members": [489, 490, 491, 492, 493, 494, 495]}, {"model": "tests.project", "pk": 20, "fields": {"status": "Public", "description": "Test"}, "members": [357]}, {"model": "tests.project", "pk": 21, "fields": {"status": "Public", "description": "Test"}, "members": [165, 166, 167, 168, 169, 170, 171, 172]}, {"model": "tests.project", "pk": 22, "fields": {"status": "Public", "description": "Test"}, "members": [16, 17, 18, 19, 20, 21, 22]}, {"model": "tests.project", "pk": 23, "fields": {"status": "Public", "description": "Test"}, "members": [159, 160, 161, 162, 163]}, {"model": "tests.project", "pk": 24, "fields": {"status": "Public", "description": "Test"}, "members": [230, 231, 232, 233]}, {"model": "tests.project", "pk": 25, "fields": {"status": "Public", "description": "Test"}, "members": [238]}, {"model": "tests.project", "pk": 26, "fields": {"status": "Public", "description": "Test"}, "members": [453, 454, 455, 456, 457, 458, 459, 460]}, {"model": "tests.project", "pk": 27, "fields": {"status": "Public", "description": "Test"}, "members": [362, 363, 364, 365, 366]}, {"model": "tests.project", "pk": 28, "fields": {"status": "Public", "description": "Test"}, "members": [71, 72, 73, 74, 75, 76, 77, 78, 79, 80]}, {"model": "tests.project", "pk": 29, "fields": {"status": "Public", "description": "Test"}, "members": [352, 353, 354, 355]}, {"model": "tests.project", "pk": 30, "fields": {"status": "Public", "description": "Test"}, "members": [149, 150, 151]}, {"model": "tests.project", "pk": 31, "fields": {"status": "Public", "description": "Test"}, "members": [488, 489, 490, 491, 492, 493]}, {"model": "tests.project", "pk": 32, "fields": {"status": "Public", "description": "Test"}, "members": [91, 92, 93, 94, 95, 96]}, {"model": "tests.project", "pk": 33, "fields": {"status": "Public", "description": "Test"}, "members": [345, 346, 347, 348, 349, 350]}, {"model": "tests.project", "pk": 34, "fields": {"status": "Public", "description": "Test"}, "members": [64, 65, 66, 67, 68, 69, 70]}, {"model": "tests.project", "pk": 35, "fields": {"status": "Public", "description": "Test"}, "members": [27, 28, 29, 30]}, {"model": "tests.project", "pk": 36, "fields": {"status": "Public", "description": "Test"}, "members": [407, 408, 409, 410, 411]}, {"model": "tests.project", "pk": 37, "fields": {"status": "Public", "description": "Test"}, "members": [201, 202, 203, 204, 205, 206, 207]}, {"model": "tests.project", "pk": 38, "fields": {"status": "Public", "description": "Test"}, "members": [47, 48, 49, 50, 51, 52, 53, 54, 55]}, {"model": "tests.project", "pk": 39, "fields": {"status": "Public", "description": "Test"}, "members": [395]}, {"model": "tests.project", "pk": 40, "fields": {"status": "Public", "description": "Test"}, "members": [487]}, {"model": "tests.project", "pk": 41, "fields": {"status": "Public", "description": "Test"}, "members": [353, 354]}, {"model": "tests.project", "pk": 42, "fields": {"status": "Public", "description": "Test"}, "members": [161, 162]}, {"model": "tests.project", "pk": 43, "fields": {"status": "Public", "description": "Test"}, "members": [115, 116]}, {"model": "tests.project", "pk": 44, "fields": {"status": "Public", "description": "Test"}, "members": [236, 237, 238, 239]}, {"model": "tests.project", "pk": 45, "fields": {"status": "Public", "description": "Test"}, "members": [125, 126, 127, 128]}, {"model": "tests.project", "pk": 46, "fields": {"status": "Public", "description": "Test"}, "members": [396, 397, 398, 399, 400, 401, 402, 403]}, {"model": "tests.project", "pk": 47, "fields": {"status": "Public", "description": "Test"}, "members": [90, 91, 92, 93, 94, 95, 96]}, {"model": "tests.project", "pk": 48, "fields": {"status": "Public", "description": "Test"}, "members": [339, 340, 341, 342, 343, 344, 345, 346, 347, 348]}, {"model": "tests.project", "pk": 49, "fields": {"status": "Public", "description": "Test"}, "members": [103, 104, 105]}, {"model": "tests.project", "pk": 50, "fields": {"status": "Public", "description": "Test"}, "members": [204, 205]}, {"model": "tests.project", "pk": 51, "fields": {"status": "Public", "description": "Test"}, "members": [108, 109, 110, 111, 112, 113, 114, 115]}, {"model": "tests.project", "pk": 52, "fields": {"status": "Public", "description": "Test"}, "members": [80, 81, 82, 83, 84, 85, 86, 87, 88]}, {"model": "tests.project", "pk": 53, "fields": {"status": "Public", "description": "Test"}, "members": [146, 147, 148, 149, 150, 151, 152, 153, 154, 155]}, {"model": "tests.project", "pk": 54, "fields": {"status": "Public", "description": "Test"}, "members": [353, 354, 355, 356, 357, 358, 359, 360, 361, 362]}, {"model": "tests.project", "pk": 55, "fields": {"status": "Public", "description": "Test"}, "members": [170, 171, 172, 173, 174, 175]}, {"model": "tests.project", "pk": 56, "fields": {"status": "Public", "description": "Test"}, "members": [397]}, {"model": "tests.project", "pk": 57, "fields": {"status": "Public", "description": "Test"}, "members": [224, 225, 226, 227]}, {"model": "tests.project", "pk": 58, "fields": {"status": "Public", "description": "Test"}, "members": [424, 425, 426, 427, 428]}, {"model": "tests.project", "pk": 59, "fields": {"status": "Public", "description": "Test"}, "members": [74, 75, 76]}, {"model": "tests.project", "pk": 60, "fields": {"status": "Public", "description": "Test"}, "members": [440, 441, 442, 443, 444, 445, 446, 447, 448]}, {"model": "tests.project", "pk": 61, "fields": {"status": "Public", "description": "Test"}, "members": [359, 360, 361]}, {"model": "tests.project", "pk": 62, "fields": {"status": "Public", "description": "Test"}, "members": [95]}, {"model": "tests.project", "pk": 63, "fields": {"status": "Public", "description": "Test"}, "members": [317, 318]}, {"model": "tests.project", "pk": 64, "fields": {"status": "Public", "description": "Test"}, "members": [79, 80, 81, 82, 83, 84, 85, 86]}, {"model": "tests.project", "pk": 65, "fields": {"status": "Public", "description": "Test"}, "members": [484]}, {"model": "tests.project", "pk": 66, "fields": {"status": "Public", "description": "Test"}, "members": [244, 245, 246]}, {"model": "tests.project", "pk": 67, "fields": {"status": "Public", "description": "Test"}, "members": [157, 158, 159, 160, 161, 162, 163, 164]}, {"model": "tests.project", "pk": 68, "fields": {"status": "Public", "description": "Test"}, "members": [447, 448, 449, 450, 451, 452]}, {"model": "tests.project", "pk": 69, "fields": {"status": "Public", "description": "Test"}, "members": [442, 443]}, {"model": "tests.project", "pk": 70, "fields": {"status": "Public", "description": "Test"}, "members": [284, 285, 286]}, {"model": "tests.project", "pk": 71, "fields": {"status": "Public", "description": "Test"}, "members": [438, 439, 440, 441, 442]}, {"model": "tests.project", "pk": 72, "fields": {"status": "Public", "description": "Test"}, "members": [178, 179, 180, 181, 182, 183, 184, 185, 186]}, {"model": "tests.project", "pk": 73, "fields": {"status": "Public", "description": "Test"}, "members": [304, 305, 306, 307, 308, 309, 310, 311, 312]}, {"model": "tests.project", "pk": 74, "fields": {"status": "Public", "description": "Test"}, "members": [351, 352]}, {"model": "tests.project", "pk": 75, "fields": {"status": "Public", "description": "Test"}, "members": [74, 75, 76, 77, 78, 79]}, {"model": "tests.project", "pk": 76, "fields": {"status": "Public", "description": "Test"}, "members": [429, 430, 431, 432, 433, 434, 435]}, {"model": "tests.project", "pk": 77, "fields": {"status": "Public", "description": "Test"}, "members": [218, 219, 220, 221]}, {"model": "tests.project", "pk": 78, "fields": {"status": "Public", "description": "Test"}, "members": [168, 169, 170, 171, 172, 173, 174]}, {"model": "tests.project", "pk": 79, "fields": {"status": "Public", "description": "Test"}, "members": [443, 444, 445, 446, 447, 448]}, {"model": "tests.project", "pk": 80, "fields": {"status": "Public", "description": "Test"}, "members": [138, 139, 140, 141, 142]}, {"model": "tests.project", "pk": 81, "fields": {"status": "Public", "description": "Test"}, "members": [228, 229, 230, 231, 232]}, {"model": "tests.project", "pk": 82, "fields": {"status": "Public", "description": "Test"}, "members": [288, 289, 290, 291, 292, 293, 294, 295]}, {"model": "tests.project", "pk": 83, "fields": {"status": "Public", "description": "Test"}, "members": [186, 187, 188, 189, 190, 191]}, {"model": "tests.project", "pk": 84, "fields": {"status": "Public", "description": "Test"}, "members": [33, 34]}, {"model": "tests.project", "pk": 85, "fields": {"status": "Public", "description": "Test"}, "members": [292]}, {"model": "tests.project", "pk": 86, "fields": {"status": "Public", "description": "Test"}, "members": [213, 214, 215, 216, 217, 218]}, {"model": "tests.project", "pk": 87, "fields": {"status": "Public", "description": "Test"}, "members": [432, 433, 434, 435]}, {"model": "tests.project", "pk": 88, "fields": {"status": "Public", "description": "Test"}, "members": [297, 298, 299]}, {"model": "tests.project", "pk": 89, "fields": {"status": "Public", "description": "Test"}, "members": [117, 118, 119, 120, 121, 122, 123, 124]}, {"model": "tests.project", "pk": 90, "fields": {"status": "Public", "description": "Test"}, "members": [443, 444, 445, 446, 447, 448, 449]}, {"model": "tests.project", "pk": 91, "fields": {"status": "Public", "description": "Test"}, "members": [211, 212]}, {"model": "tests.project", "pk": 92, "fields": {"status": "Public", "description": "Test"}, "members": [39, 40, 41, 42, 43, 44, 45, 46, 47, 48]}, {"model": "tests.project", "pk": 93, "fields": {"status": "Public", "description": "Test"}, "members": [6, 7, 8, 9]}, {"model": "tests.project", "pk": 94, "fields": {"status": "Public", "description": "Test"}, "members": [8, 9, 10, 11, 12, 13, 14, 15, 16, 17]}, {"model": "tests.project", "pk": 95, "fields": {"status": "Public", "description": "Test"}, "members": [259, 260, 261, 262, 263, 264, 265, 266, 267, 268]}, {"model": "tests.project", "pk": 96, "fields": {"status": "Public", "description": "Test"}, "members": [379, 380, 381, 382]}, {"model": "tests.project", "pk": 97, "fields": {"status": "Public", "description": "Test"}, "members": [255]}, {"model": "tests.project", "pk": 98, "fields": {"status": "Public", "description": "Test"}, "members": [475, 476, 477, 478, 479, 480, 481, 482]}, {"model": "tests.project", "pk": 99, "fields": {"status": "Public", "description": "Test"}, "members": [484, 485, 486, 487, 488]}, {"model": "tests.project", "pk": 100, "fields": {"status": "Public", "description": "Test"}, "members": [341, 342, 343, 344, 345, 346, 347]}, {"model": "tests.project", "pk": 101, "fields": {"status": "Public", "description": "Test"}, "members": [340, 341]}, {"model": "tests.project", "pk": 102, "fields": {"status": "Public", "description": "Test"}, "members": [460, 461, 462, 463, 464, 465, 466, 467]}, {"model": "tests.project", "pk": 103, "fields": {"status": "Public", "description": "Test"}, "members": [440]}, {"model": "tests.project", "pk": 104, "fields": {"status": "Public", "description": "Test"}, "members": [132, 133, 134, 135, 136, 137]}, {"model": "tests.project", "pk": 105, "fields": {"status": "Public", "description": "Test"}, "members": [26, 27, 28, 29, 30, 31, 32, 33]}, {"model": "tests.project", "pk": 106, "fields": {"status": "Public", "description": "Test"}, "members": [286, 287, 288, 289, 290, 291, 292]}, {"model": "tests.project", "pk": 107, "fields": {"status": "Public", "description": "Test"}, "members": [191, 192, 193, 194, 195, 196, 197, 198]}, {"model": "tests.project", "pk": 108, "fields": {"status": "Public", "description": "Test"}, "members": [200, 201, 202, 203]}, {"model": "tests.project", "pk": 109, "fields": {"status": "Public", "description": "Test"}, "members": [430, 431, 432, 433, 434]}, {"model": "tests.project", "pk": 110, "fields": {"status": "Public", "description": "Test"}, "members": [181, 182, 183]}, {"model": "tests.project", "pk": 111, "fields": {"status": "Public", "description": "Test"}, "members": [119, 120, 121, 122]}, {"model": "tests.project", "pk": 112, "fields": {"status": "Public", "description": "Test"}, "members": [453, 454, 455, 456, 457, 458, 459, 460]}, {"model": "tests.project", "pk": 113, "fields": {"status": "Public", "description": "Test"}, "members": [359, 360, 361]}, {"model": "tests.project", "pk": 114, "fields": {"status": "Public", "description": "Test"}, "members": [87, 88, 89, 90, 91, 92, 93]}, {"model": "tests.project", "pk": 115, "fields": {"status": "Public", "description": "Test"}, "members": [137, 138, 139]}, {"model": "tests.project", "pk": 116, "fields": {"status": "Public", "description": "Test"}, "members": [12, 13]}, {"model": "tests.project", "pk": 117, "fields": {"status": "Public", "description": "Test"}, "members": [80, 81, 82, 83]}, {"model": "tests.project", "pk": 118, "fields": {"status": "Public", "description": "Test"}, "members": [409, 410, 411, 412, 413, 414, 415, 416, 417, 418]}, {"model": "tests.project", "pk": 119, "fields": {"status": "Public", "description": "Test"}, "members": [298, 299, 300, 301, 302, 303, 304, 305, 306, 307]}, {"model": "tests.project", "pk": 120, "fields": {"status": "Public", "description": "Test"}, "members": [80, 81, 82, 83, 84]}, {"model": "tests.project", "pk": 121, "fields": {"status": "Public", "description": "Test"}, "members": [268, 269, 270]}, {"model": "tests.project", "pk": 122, "fields": {"status": "Public", "description": "Test"}, "members": [397, 398, 399, 400, 401]}, {"model": "tests.project", "pk": 123, "fields": {"status": "Public", "description": "Test"}, "members": [352, 353, 354, 355, 356, 357, 358, 359, 360, 361]}, {"model": "tests.project", "pk": 124, "fields": {"status": "Public", "description": "Test"}, "members": [21, 22, 23, 24, 25, 26, 27, 28]}, {"model": "tests.project", "pk": 125, "fields": {"status": "Public", "description": "Test"}, "members": [187, 188, 189, 190]}, {"model": "tests.project", "pk": 126, "fields": {"status": "Public", "description": "Test"}, "members": [215, 216, 217, 218, 219, 220, 221, 222, 223, 224]}, {"model": "tests.project", "pk": 127, "fields": {"status": "Public", "description": "Test"}, "members": [156, 157, 158, 159]}, {"model": "tests.project", "pk": 128, "fields": {"status": "Public", "description": "Test"}, "members": [351, 352, 353]}, {"model": "tests.project", "pk": 129, "fields": {"status": "Public", "description": "Test"}, "members": [313, 314, 315, 316, 317, 318, 319, 320, 321]}, {"model": "tests.project", "pk": 130, "fields": {"status": "Public", "description": "Test"}, "members": [434, 435, 436, 437, 438, 439, 440, 441]}, {"model": "tests.project", "pk": 131, "fields": {"status": "Public", "description": "Test"}, "members": [348, 349, 350, 351, 352]}, {"model": "tests.project", "pk": 132, "fields": {"status": "Public", "description": "Test"}, "members": [131, 132, 133, 134, 135]}, {"model": "tests.project", "pk": 133, "fields": {"status": "Public", "description": "Test"}, "members": [28, 29, 30, 31, 32, 33]}, {"model": "tests.project", "pk": 134, "fields": {"status": "Public", "description": "Test"}, "members": [277, 278, 279, 280, 281, 282]}, {"model": "tests.project", "pk": 135, "fields": {"status": "Public", "description": "Test"}, "members": [481, 482]}, {"model": "tests.project", "pk": 136, "fields": {"status": "Public", "description": "Test"}, "members": [380, 381, 382, 383]}, {"model": "tests.project", "pk": 137, "fields": {"status": "Public", "description": "Test"}, "members": [279, 280, 281, 282, 283, 284, 285, 286, 287]}, {"model": "tests.project", "pk": 138, "fields": {"status": "Public", "description": "Test"}, "members": [385, 386, 387, 388, 389, 390, 391, 392, 393, 394]}, {"model": "tests.project", "pk": 139, "fields": {"status": "Public", "description": "Test"}, "members": [44, 45]}, {"model": "tests.project", "pk": 140, "fields": {"status": "Public", "description": "Test"}, "members": [257, 258, 259]}, {"model": "tests.project", "pk": 141, "fields": {"status": "Public", "description": "Test"}, "members": [133, 134, 135, 136, 137, 138, 139, 140, 141, 142]}, {"model": "tests.project", "pk": 142, "fields": {"status": "Public", "description": "Test"}, "members": [337, 338, 339, 340, 341, 342, 343]}, {"model": "tests.project", "pk": 143, "fields": {"status": "Public", "description": "Test"}, "members": [70, 71]}, {"model": "tests.project", "pk": 144, "fields": {"status": "Public", "description": "Test"}, "members": [137, 138, 139, 140, 141, 142, 143, 144, 145]}, {"model": "tests.project", "pk": 145, "fields": {"status": "Public", "description": "Test"}, "members": [273, 274, 275, 276, 277, 278]}, {"model": "tests.project", "pk": 146, "fields": {"status": "Public", "description": "Test"}, "members": [26, 27, 28, 29]}, {"model": "tests.project", "pk": 147, "fields": {"status": "Public", "description": "Test"}, "members": [407]}, {"model": "tests.project", "pk": 148, "fields": {"status": "Public", "description": "Test"}, "members": [453]}, {"model": "tests.project", "pk": 149, "fields": {"status": "Public", "description": "Test"}, "members": [360, 361, 362, 363, 364, 365, 366]}, {"model": "tests.project", "pk": 150, "fields": {"status": "Public", "description": "Test"}, "members": [109, 110, 111, 112, 113, 114, 115, 116, 117]}, {"model": "tests.project", "pk": 151, "fields": {"status": "Public", "description": "Test"}, "members": [114, 115, 116, 117, 118]}, {"model": "tests.project", "pk": 152, "fields": {"status": "Public", "description": "Test"}, "members": [229, 230]}, {"model": "tests.project", "pk": 153, "fields": {"status": "Public", "description": "Test"}, "members": [158, 159, 160, 161, 162]}, {"model": "tests.project", "pk": 154, "fields": {"status": "Public", "description": "Test"}, "members": [26, 27, 28]}, {"model": "tests.project", "pk": 155, "fields": {"status": "Public", "description": "Test"}, "members": [435, 436]}, {"model": "tests.project", "pk": 156, "fields": {"status": "Public", "description": "Test"}, "members": [79]}, {"model": "tests.project", "pk": 157, "fields": {"status": "Public", "description": "Test"}, "members": [436, 437, 438, 439, 440, 441, 442, 443]}, {"model": "tests.project", "pk": 158, "fields": {"status": "Public", "description": "Test"}, "members": [86]}, {"model": "tests.project", "pk": 159, "fields": {"status": "Public", "description": "Test"}, "members": [167, 168, 169, 170, 171, 172, 173, 174, 175, 176]}, {"model": "tests.project", "pk": 160, "fields": {"status": "Public", "description": "Test"}, "members": [172, 173, 174, 175, 176, 177]}, {"model": "tests.project", "pk": 161, "fields": {"status": "Public", "description": "Test"}, "members": [410, 411, 412, 413, 414, 415, 416, 417]}, {"model": "tests.project", "pk": 162, "fields": {"status": "Public", "description": "Test"}, "members": [330, 331, 332, 333, 334, 335]}, {"model": "tests.project", "pk": 163, "fields": {"status": "Public", "description": "Test"}, "members": [10, 11]}, {"model": "tests.project", "pk": 164, "fields": {"status": "Public", "description": "Test"}, "members": [241, 242, 243]}, {"model": "tests.project", "pk": 165, "fields": {"status": "Public", "description": "Test"}, "members": [37, 38, 39, 40, 41, 42, 43, 44, 45]}, {"model": "tests.project", "pk": 166, "fields": {"status": "Public", "description": "Test"}, "members": [96, 97]}, {"model": "tests.project", "pk": 167, "fields": {"status": "Public", "description": "Test"}, "members": [463, 464, 465, 466, 467, 468, 469, 470]}, {"model": "tests.project", "pk": 168, "fields": {"status": "Public", "description": "Test"}, "members": [259, 260, 261, 262, 263, 264, 265, 266, 267]}, {"model": "tests.project", "pk": 169, "fields": {"status": "Public", "description": "Test"}, "members": [265, 266]}, {"model": "tests.project", "pk": 170, "fields": {"status": "Public", "description": "Test"}, "members": [345, 346, 347, 348, 349]}, {"model": "tests.project", "pk": 171, "fields": {"status": "Public", "description": "Test"}, "members": [283]}, {"model": "tests.project", "pk": 172, "fields": {"status": "Public", "description": "Test"}, "members": [237, 238, 239, 240, 241, 242, 243, 244]}, {"model": "tests.project", "pk": 173, "fields": {"status": "Public", "description": "Test"}, "members": [88]}, {"model": "tests.project", "pk": 174, "fields": {"status": "Public", "description": "Test"}, "members": [85, 86, 87]}, {"model": "tests.project", "pk": 175, "fields": {"status": "Public", "description": "Test"}, "members": [321]}, {"model": "tests.project", "pk": 176, "fields": {"status": "Public", "description": "Test"}, "members": [419, 420, 421, 422, 423, 424, 425]}, {"model": "tests.project", "pk": 177, "fields": {"status": "Public", "description": "Test"}, "members": [199, 200, 201, 202, 203, 204]}, {"model": "tests.project", "pk": 178, "fields": {"status": "Public", "description": "Test"}, "members": [175, 176, 177, 178, 179]}, {"model": "tests.project", "pk": 179, "fields": {"status": "Public", "description": "Test"}, "members": [292, 293, 294, 295, 296, 297, 298]}, {"model": "tests.project", "pk": 180, "fields": {"status": "Public", "description": "Test"}, "members": [25, 26, 27, 28, 29, 30, 31]}, {"model": "tests.project", "pk": 181, "fields": {"status": "Public", "description": "Test"}, "members": [376, 377, 378, 379, 380, 381, 382, 383, 384, 385]}, {"model": "tests.project", "pk": 182, "fields": {"status": "Public", "description": "Test"}, "members": [412, 413, 414, 415, 416, 417, 418]}, {"model": "tests.project", "pk": 183, "fields": {"status": "Public", "description": "Test"}, "members": [350, 351, 352, 353, 354, 355, 356, 357, 358]}, {"model": "tests.project", "pk": 184, "fields": {"status": "Public", "description": "Test"}, "members": [329, 330, 331, 332, 333, 334, 335, 336]}, {"model": "tests.project", "pk": 185, "fields": {"status": "Public", "description": "Test"}, "members": [329]}, {"model": "tests.project", "pk": 186, "fields": {"status": "Public", "description": "Test"}, "members": [378, 379, 380]}, {"model": "tests.project", "pk": 187, "fields": {"status": "Public", "description": "Test"}, "members": [192, 193, 194]}, {"model": "tests.project", "pk": 188, "fields": {"status": "Public", "description": "Test"}, "members": [277, 278]}, {"model": "tests.project", "pk": 189, "fields": {"status": "Public", "description": "Test"}, "members": [279, 280, 281, 282]}, {"model": "tests.project", "pk": 190, "fields": {"status": "Public", "description": "Test"}, "members": [137, 138, 139, 140, 141, 142, 143, 144, 145, 146]}, {"model": "tests.project", "pk": 191, "fields": {"status": "Public", "description": "Test"}, "members": [31]}, {"model": "tests.project", "pk": 192, "fields": {"status": "Public", "description": "Test"}, "members": [35]}, {"model": "tests.project", "pk": 193, "fields": {"status": "Public", "description": "Test"}, "members": [87, 88, 89, 90, 91, 92]}, {"model": "tests.project", "pk": 194, "fields": {"status": "Public", "description": "Test"}, "members": [318]}, {"model": "tests.project", "pk": 195, "fields": {"status": "Public", "description": "Test"}, "members": [232]}, {"model": "tests.project", "pk": 196, "fields": {"status": "Public", "description": "Test"}, "members": [326, 327, 328, 329, 330, 331, 332, 333]}, {"model": "tests.project", "pk": 197, "fields": {"status": "Public", "description": "Test"}, "members": [12, 13, 14, 15, 16]}, {"model": "tests.project", "pk": 198, "fields": {"status": "Public", "description": "Test"}, "members": [68, 69, 70, 71, 72, 73, 74]}, {"model": "tests.project", "pk": 199, "fields": {"status": "Public", "description": "Test"}, "members": [239, 240, 241, 242, 243, 244, 245, 246, 247]}, {"model": "tests.project", "pk": 200, "fields": {"status": "Public", "description": "Test"}, "members": [63, 64, 65, 66, 67, 68, 69, 70, 71]}, {"model": "tests.project", "pk": 201, "fields": {"status": "Public", "description": "Test"}, "members": [454, 455, 456, 457, 458, 459, 460, 461, 462]}, {"model": "tests.project", "pk": 202, "fields": {"status": "Public", "description": "Test"}, "members": [240, 241, 242, 243, 244, 245, 246, 247, 248, 249]}, {"model": "tests.project", "pk": 203, "fields": {"status": "Public", "description": "Test"}, "members": [233, 234, 235, 236, 237, 238, 239, 240, 241, 242]}, {"model": "tests.project", "pk": 204, "fields": {"status": "Public", "description": "Test"}, "members": [279, 280, 281]}, {"model": "tests.project", "pk": 205, "fields": {"status": "Public", "description": "Test"}, "members": [43, 44, 45, 46, 47, 48]}, {"model": "tests.project", "pk": 206, "fields": {"status": "Public", "description": "Test"}, "members": [452, 453, 454, 455, 456, 457, 458, 459, 460]}, {"model": "tests.project", "pk": 207, "fields": {"status": "Public", "description": "Test"}, "members": [302, 303, 304, 305, 306, 307, 308]}, {"model": "tests.project", "pk": 208, "fields": {"status": "Public", "description": "Test"}, "members": [23, 24, 25, 26, 27, 28, 29, 30, 31]}, {"model": "tests.project", "pk": 209, "fields": {"status": "Public", "description": "Test"}, "members": [159, 160, 161, 162, 163, 164]}, {"model": "tests.project", "pk": 210, "fields": {"status": "Public", "description": "Test"}, "members": [379, 380, 381, 382, 383]}, {"model": "tests.project", "pk": 211, "fields": {"status": "Public", "description": "Test"}, "members": [305, 306, 307, 308, 309, 310, 311, 312]}, {"model": "tests.project", "pk": 212, "fields": {"status": "Public", "description": "Test"}, "members": [400, 401, 402, 403, 404]}, {"model": "tests.project", "pk": 213, "fields": {"status": "Public", "description": "Test"}, "members": [428]}, {"model": "tests.project", "pk": 214, "fields": {"status": "Public", "description": "Test"}, "members": [312, 313, 314, 315, 316, 317, 318, 319]}, {"model": "tests.project", "pk": 215, "fields": {"status": "Public", "description": "Test"}, "members": [239, 240, 241]}, {"model": "tests.project", "pk": 216, "fields": {"status": "Public", "description": "Test"}, "members": [329, 330, 331, 332, 333, 334, 335, 336, 337]}, {"model": "tests.project", "pk": 217, "fields": {"status": "Public", "description": "Test"}, "members": [409, 410, 411, 412]}, {"model": "tests.project", "pk": 218, "fields": {"status": "Public", "description": "Test"}, "members": [462, 463, 464, 465, 466]}, {"model": "tests.project", "pk": 219, "fields": {"status": "Public", "description": "Test"}, "members": [183, 184, 185, 186, 187, 188, 189, 190]}, {"model": "tests.project", "pk": 220, "fields": {"status": "Public", "description": "Test"}, "members": [387, 388, 389, 390, 391, 392]}, {"model": "tests.project", "pk": 221, "fields": {"status": "Public", "description": "Test"}, "members": [312, 313, 314, 315, 316, 317, 318, 319, 320, 321]}, {"model": "tests.project", "pk": 222, "fields": {"status": "Public", "description": "Test"}, "members": [153]}, {"model": "tests.project", "pk": 223, "fields": {"status": "Public", "description": "Test"}, "members": [438, 439, 440, 441, 442, 443]}, {"model": "tests.project", "pk": 224, "fields": {"status": "Public", "description": "Test"}, "members": [152, 153, 154, 155]}, {"model": "tests.project", "pk": 225, "fields": {"status": "Public", "description": "Test"}, "members": [156, 157]}, {"model": "tests.project", "pk": 226, "fields": {"status": "Public", "description": "Test"}, "members": [242, 243, 244, 245, 246]}, {"model": "tests.project", "pk": 227, "fields": {"status": "Public", "description": "Test"}, "members": [45, 46, 47]}, {"model": "tests.project", "pk": 228, "fields": {"status": "Public", "description": "Test"}, "members": [295, 296, 297, 298, 299, 300]}, {"model": "tests.project", "pk": 229, "fields": {"status": "Public", "description": "Test"}, "members": [338, 339, 340]}, {"model": "tests.project", "pk": 230, "fields": {"status": "Public", "description": "Test"}, "members": [214, 215]}, {"model": "tests.project", "pk": 231, "fields": {"status": "Public", "description": "Test"}, "members": [183, 184, 185, 186, 187, 188, 189, 190, 191]}, {"model": "tests.project", "pk": 232, "fields": {"status": "Public", "description": "Test"}, "members": [434, 435, 436, 437, 438, 439]}, {"model": "tests.project", "pk": 233, "fields": {"status": "Public", "description": "Test"}, "members": [93, 94, 95, 96, 97, 98, 99, 100]}, {"model": "tests.project", "pk": 234, "fields": {"status": "Public", "description": "Test"}, "members": [410, 411]}, {"model": "tests.project", "pk": 235, "fields": {"status": "Public", "description": "Test"}, "members": [226, 227, 228, 229, 230, 231]}, {"model": "tests.project", "pk": 236, "fields": {"status": "Public", "description": "Test"}, "members": [298, 299]}, {"model": "tests.project", "pk": 237, "fields": {"status": "Public", "description": "Test"}, "members": [25, 26, 27]}, {"model": "tests.project", "pk": 238, "fields": {"status": "Public", "description": "Test"}, "members": [206, 207]}, {"model": "tests.project", "pk": 239, "fields": {"status": "Public", "description": "Test"}, "members": [64, 65, 66, 67, 68, 69, 70, 71, 72, 73]}, {"model": "tests.project", "pk": 240, "fields": {"status": "Public", "description": "Test"}, "members": [372, 373, 374]}, {"model": "tests.project", "pk": 241, "fields": {"status": "Public", "description": "Test"}, "members": [447, 448, 449, 450, 451]}, {"model": "tests.project", "pk": 242, "fields": {"status": "Public", "description": "Test"}, "members": [119, 120]}, {"model": "tests.project", "pk": 243, "fields": {"status": "Public", "description": "Test"}, "members": [83, 84, 85, 86, 87]}, {"model": "tests.project", "pk": 244, "fields": {"status": "Public", "description": "Test"}, "members": [388, 389, 390, 391, 392]}, {"model": "tests.project", "pk": 245, "fields": {"status": "Public", "description": "Test"}, "members": [214, 215, 216, 217]}, {"model": "tests.project", "pk": 246, "fields": {"status": "Public", "description": "Test"}, "members": [197]}, {"model": "tests.project", "pk": 247, "fields": {"status": "Public", "description": "Test"}, "members": [448, 449, 450, 451]}, {"model": "tests.project", "pk": 248, "fields": {"status": "Public", "description": "Test"}, "members": [451, 452, 453, 454, 455, 456, 457, 458, 459]}, {"model": "tests.project", "pk": 249, "fields": {"status": "Public", "description": "Test"}, "members": [394, 395, 396, 397, 398, 399, 400]}, {"model": "tests.project", "pk": 250, "fields": {"status": "Public", "description": "Test"}, "members": [262, 263, 264]}, {"model": "tests.project", "pk": 251, "fields": {"status": "Public", "description": "Test"}, "members": [267, 268, 269, 270, 271, 272]}, {"model": "tests.project", "pk": 252, "fields": {"status": "Public", "description": "Test"}, "members": [356, 357]}, {"model": "tests.project", "pk": 253, "fields": {"status": "Public", "description": "Test"}, "members": [166, 167, 168, 169, 170]}, {"model": "tests.project", "pk": 254, "fields": {"status": "Public", "description": "Test"}, "members": [225, 226, 227, 228, 229, 230, 231, 232, 233, 234]}, {"model": "tests.project", "pk": 255, "fields": {"status": "Public", "description": "Test"}, "members": [220, 221]}, {"model": "tests.project", "pk": 256, "fields": {"status": "Public", "description": "Test"}, "members": [95, 96, 97, 98, 99, 100]}, {"model": "tests.project", "pk": 257, "fields": {"status": "Public", "description": "Test"}, "members": [225, 226, 227]}, {"model": "tests.project", "pk": 258, "fields": {"status": "Public", "description": "Test"}, "members": [227, 228, 229, 230, 231, 232, 233]}, {"model": "tests.project", "pk": 259, "fields": {"status": "Public", "description": "Test"}, "members": [143]}, {"model": "tests.project", "pk": 260, "fields": {"status": "Public", "description": "Test"}, "members": [292, 293, 294, 295]}, {"model": "tests.project", "pk": 261, "fields": {"status": "Public", "description": "Test"}, "members": [6, 7, 8, 9, 10, 11, 12, 13, 14]}, {"model": "tests.project", "pk": 262, "fields": {"status": "Public", "description": "Test"}, "members": [214, 215, 216, 217]}, {"model": "tests.project", "pk": 263, "fields": {"status": "Public", "description": "Test"}, "members": [65, 66, 67, 68, 69, 70, 71, 72, 73]}, {"model": "tests.project", "pk": 264, "fields": {"status": "Public", "description": "Test"}, "members": [373, 374, 375, 376, 377, 378, 379, 380, 381]}, {"model": "tests.project", "pk": 265, "fields": {"status": "Public", "description": "Test"}, "members": [60, 61]}, {"model": "tests.project", "pk": 266, "fields": {"status": "Public", "description": "Test"}, "members": [224, 225, 226, 227, 228, 229, 230]}, {"model": "tests.project", "pk": 267, "fields": {"status": "Public", "description": "Test"}, "members": [361, 362]}, {"model": "tests.project", "pk": 268, "fields": {"status": "Public", "description": "Test"}, "members": [290, 291, 292, 293, 294, 295, 296, 297, 298]}, {"model": "tests.project", "pk": 269, "fields": {"status": "Public", "description": "Test"}, "members": [129, 130, 131, 132, 133, 134, 135, 136, 137]}, {"model": "tests.project", "pk": 270, "fields": {"status": "Public", "description": "Test"}, "members": [163, 164, 165, 166, 167, 168, 169]}, {"model": "tests.project", "pk": 271, "fields": {"status": "Public", "description": "Test"}, "members": [55, 56, 57, 58, 59, 60]}, {"model": "tests.project", "pk": 272, "fields": {"status": "Public", "description": "Test"}, "members": [461, 462, 463, 464, 465, 466, 467, 468, 469, 470]}, {"model": "tests.project", "pk": 273, "fields": {"status": "Public", "description": "Test"}, "members": [340, 341, 342]}, {"model": "tests.project", "pk": 274, "fields": {"status": "Public", "description": "Test"}, "members": [378, 379, 380, 381, 382, 383, 384, 385, 386, 387]}, {"model": "tests.project", "pk": 275, "fields": {"status": "Public", "description": "Test"}, "members": [341, 342, 343, 344, 345, 346, 347, 348]}, {"model": "tests.project", "pk": 276, "fields": {"status": "Public", "description": "Test"}, "members": [275, 276, 277, 278, 279, 280, 281, 282, 283]}, {"model": "tests.project", "pk": 277, "fields": {"status": "Public", "description": "Test"}, "members": [191, 192, 193, 194, 195, 196, 197, 198]}, {"model": "tests.project", "pk": 278, "fields": {"status": "Public", "description": "Test"}, "members": [270, 271, 272, 273, 274, 275]}, {"model": "tests.project", "pk": 279, "fields": {"status": "Public", "description": "Test"}, "members": [258, 259]}, {"model": "tests.project", "pk": 280, "fields": {"status": "Public", "description": "Test"}, "members": [415, 416, 417, 418, 419, 420, 421, 422, 423, 424]}, {"model": "tests.project", "pk": 281, "fields": {"status": "Public", "description": "Test"}, "members": [354, 355, 356, 357]}, {"model": "tests.project", "pk": 282, "fields": {"status": "Public", "description": "Test"}, "members": [207, 208, 209, 210, 211, 212, 213, 214, 215]}, {"model": "tests.project", "pk": 283, "fields": {"status": "Public", "description": "Test"}, "members": [287, 288, 289, 290, 291]}, {"model": "tests.project", "pk": 284, "fields": {"status": "Public", "description": "Test"}, "members": [370, 371]}, {"model": "tests.project", "pk": 285, "fields": {"status": "Public", "description": "Test"}, "members": [440, 441, 442]}, {"model": "tests.project", "pk": 286, "fields": {"status": "Public", "description": "Test"}, "members": [246, 247, 248, 249, 250, 251, 252]}, {"model": "tests.project", "pk": 287, "fields": {"status": "Public", "description": "Test"}, "members": [61, 62, 63, 64, 65, 66]}, {"model": "tests.project", "pk": 288, "fields": {"status": "Public", "description": "Test"}, "members": [443, 444, 445, 446, 447, 448, 449, 450]}, {"model": "tests.project", "pk": 289, "fields": {"status": "Public", "description": "Test"}, "members": [364, 365]}, {"model": "tests.project", "pk": 290, "fields": {"status": "Public", "description": "Test"}, "members": [270, 271, 272, 273, 274, 275, 276, 277]}, {"model": "tests.project", "pk": 291, "fields": {"status": "Public", "description": "Test"}, "members": [213, 214, 215, 216, 217, 218, 219, 220, 221]}, {"model": "tests.project", "pk": 292, "fields": {"status": "Public", "description": "Test"}, "members": [278, 279, 280]}, {"model": "tests.project", "pk": 293, "fields": {"status": "Public", "description": "Test"}, "members": [211, 212, 213, 214, 215]}, {"model": "tests.project", "pk": 294, "fields": {"status": "Public", "description": "Test"}, "members": [324, 325, 326]}, {"model": "tests.project", "pk": 295, "fields": {"status": "Public", "description": "Test"}, "members": [19, 20]}, {"model": "tests.project", "pk": 296, "fields": {"status": "Public", "description": "Test"}, "members": [256, 257, 258, 259, 260, 261, 262, 263, 264]}, {"model": "tests.project", "pk": 297, "fields": {"status": "Public", "description": "Test"}, "members": [451, 452, 453]}, {"model": "tests.project", "pk": 298, "fields": {"status": "Public", "description": "Test"}, "members": [412, 413, 414, 415, 416, 417, 418]}, {"model": "tests.project", "pk": 299, "fields": {"status": "Public", "description": "Test"}, "members": [256, 257, 258, 259, 260, 261, 262]}, {"model": "tests.project", "pk": 300, "fields": {"status": "Public", "description": "Test"}, "members": [400, 401, 402, 403, 404, 405, 406, 407, 408, 409]}, {"model": "tests.project", "pk": 301, "fields": {"status": "Public", "description": "Test"}, "members": [392]}, {"model": "tests.project", "pk": 302, "fields": {"status": "Public", "description": "Test"}, "members": [296, 297, 298, 299, 300, 301, 302, 303]}, {"model": "tests.project", "pk": 303, "fields": {"status": "Public", "description": "Test"}, "members": [452, 453, 454, 455, 456, 457, 458, 459]}, {"model": "tests.project", "pk": 304, "fields": {"status": "Public", "description": "Test"}, "members": [408, 409, 410]}, {"model": "tests.project", "pk": 305, "fields": {"status": "Public", "description": "Test"}, "members": [225, 226, 227]}, {"model": "tests.project", "pk": 306, "fields": {"status": "Public", "description": "Test"}, "members": [447, 448, 449, 450, 451, 452, 453]}, {"model": "tests.project", "pk": 307, "fields": {"status": "Public", "description": "Test"}, "members": [434, 435, 436, 437, 438, 439]}, {"model": "tests.project", "pk": 308, "fields": {"status": "Public", "description": "Test"}, "members": [199, 200, 201, 202, 203, 204, 205, 206]}, {"model": "tests.project", "pk": 309, "fields": {"status": "Public", "description": "Test"}, "members": [53]}, {"model": "tests.project", "pk": 310, "fields": {"status": "Public", "description": "Test"}, "members": [153, 154, 155, 156, 157, 158, 159, 160, 161]}, {"model": "tests.project", "pk": 311, "fields": {"status": "Public", "description": "Test"}, "members": [351, 352, 353, 354, 355, 356, 357, 358, 359, 360]}, {"model": "tests.project", "pk": 312, "fields": {"status": "Public", "description": "Test"}, "members": [462, 463, 464, 465, 466, 467, 468, 469, 470]}, {"model": "tests.project", "pk": 313, "fields": {"status": "Public", "description": "Test"}, "members": [166, 167, 168, 169, 170, 171, 172, 173]}, {"model": "tests.project", "pk": 314, "fields": {"status": "Public", "description": "Test"}, "members": [199, 200, 201, 202]}, {"model": "tests.project", "pk": 315, "fields": {"status": "Public", "description": "Test"}, "members": [160, 161, 162, 163, 164, 165, 166, 167]}, {"model": "tests.project", "pk": 316, "fields": {"status": "Public", "description": "Test"}, "members": [127, 128, 129, 130, 131]}, {"model": "tests.project", "pk": 317, "fields": {"status": "Public", "description": "Test"}, "members": [101]}, {"model": "tests.project", "pk": 318, "fields": {"status": "Public", "description": "Test"}, "members": [390, 391, 392, 393]}, {"model": "tests.project", "pk": 319, "fields": {"status": "Public", "description": "Test"}, "members": [207, 208, 209, 210, 211, 212]}, {"model": "tests.project", "pk": 320, "fields": {"status": "Public", "description": "Test"}, "members": [238, 239, 240]}, {"model": "tests.project", "pk": 321, "fields": {"status": "Public", "description": "Test"}, "members": [279, 280, 281, 282, 283, 284]}, {"model": "tests.project", "pk": 322, "fields": {"status": "Public", "description": "Test"}, "members": [155, 156]}, {"model": "tests.project", "pk": 323, "fields": {"status": "Public", "description": "Test"}, "members": [166, 167, 168, 169, 170]}, {"model": "tests.project", "pk": 324, "fields": {"status": "Public", "description": "Test"}, "members": [89, 90, 91, 92, 93, 94, 95, 96]}, {"model": "tests.project", "pk": 325, "fields": {"status": "Public", "description": "Test"}, "members": [458, 459, 460, 461, 462]}, {"model": "tests.project", "pk": 326, "fields": {"status": "Public", "description": "Test"}, "members": [489, 490, 491]}, {"model": "tests.project", "pk": 327, "fields": {"status": "Public", "description": "Test"}, "members": [152, 153, 154, 155]}, {"model": "tests.project", "pk": 328, "fields": {"status": "Public", "description": "Test"}, "members": [475, 476, 477, 478, 479, 480]}, {"model": "tests.project", "pk": 329, "fields": {"status": "Public", "description": "Test"}, "members": [270, 271, 272, 273]}, {"model": "tests.project", "pk": 330, "fields": {"status": "Public", "description": "Test"}, "members": [214, 215, 216, 217, 218]}, {"model": "tests.project", "pk": 331, "fields": {"status": "Public", "description": "Test"}, "members": [137, 138, 139, 140, 141]}, {"model": "tests.project", "pk": 332, "fields": {"status": "Public", "description": "Test"}, "members": [381, 382]}, {"model": "tests.project", "pk": 333, "fields": {"status": "Public", "description": "Test"}, "members": [82, 83, 84, 85]}, {"model": "tests.project", "pk": 334, "fields": {"status": "Public", "description": "Test"}, "members": [294, 295, 296, 297, 298, 299, 300, 301, 302, 303]}, {"model": "tests.project", "pk": 335, "fields": {"status": "Public", "description": "Test"}, "members": [437, 438, 439, 440, 441, 442]}, {"model": "tests.project", "pk": 336, "fields": {"status": "Public", "description": "Test"}, "members": [180, 181, 182, 183]}, {"model": "tests.project", "pk": 337, "fields": {"status": "Public", "description": "Test"}, "members": [409, 410, 411, 412, 413]}, {"model": "tests.project", "pk": 338, "fields": {"status": "Public", "description": "Test"}, "members": [31, 32, 33, 34, 35, 36, 37, 38, 39]}, {"model": "tests.project", "pk": 339, "fields": {"status": "Public", "description": "Test"}, "members": [360, 361]}, {"model": "tests.project", "pk": 340, "fields": {"status": "Public", "description": "Test"}, "members": [471, 472, 473, 474]}, {"model": "tests.project", "pk": 341, "fields": {"status": "Public", "description": "Test"}, "members": [215, 216, 217, 218, 219, 220, 221, 222, 223, 224]}, {"model": "tests.project", "pk": 342, "fields": {"status": "Public", "description": "Test"}, "members": [317, 318, 319, 320]}, {"model": "tests.project", "pk": 343, "fields": {"status": "Public", "description": "Test"}, "members": [362, 363, 364, 365, 366, 367]}, {"model": "tests.project", "pk": 344, "fields": {"status": "Public", "description": "Test"}, "members": [305, 306, 307, 308, 309, 310, 311, 312, 313, 314]}, {"model": "tests.project", "pk": 345, "fields": {"status": "Public", "description": "Test"}, "members": [105, 106, 107, 108, 109, 110, 111, 112]}, {"model": "tests.project", "pk": 346, "fields": {"status": "Public", "description": "Test"}, "members": [390, 391, 392]}, {"model": "tests.project", "pk": 347, "fields": {"status": "Public", "description": "Test"}, "members": [438, 439, 440, 441, 442]}, {"model": "tests.project", "pk": 348, "fields": {"status": "Public", "description": "Test"}, "members": [370, 371, 372]}, {"model": "tests.project", "pk": 349, "fields": {"status": "Public", "description": "Test"}, "members": [489, 490, 491, 492, 493]}, {"model": "tests.project", "pk": 350, "fields": {"status": "Public", "description": "Test"}, "members": [336]}, {"model": "tests.project", "pk": 351, "fields": {"status": "Public", "description": "Test"}, "members": [265, 266, 267, 268, 269]}, {"model": "tests.project", "pk": 352, "fields": {"status": "Public", "description": "Test"}, "members": [370, 371, 372, 373, 374, 375, 376]}, {"model": "tests.project", "pk": 353, "fields": {"status": "Public", "description": "Test"}, "members": [158, 159, 160, 161, 162, 163]}, {"model": "tests.project", "pk": 354, "fields": {"status": "Public", "description": "Test"}, "members": [34, 35, 36, 37, 38]}, {"model": "tests.project", "pk": 355, "fields": {"status": "Public", "description": "Test"}, "members": [70, 71, 72, 73, 74]}, {"model": "tests.project", "pk": 356, "fields": {"status": "Public", "description": "Test"}, "members": [48, 49]}, {"model": "tests.project", "pk": 357, "fields": {"status": "Public", "description": "Test"}, "members": [348, 349, 350, 351, 352, 353, 354, 355]}, {"model": "tests.project", "pk": 358, "fields": {"status": "Public", "description": "Test"}, "members": [51, 52]}, {"model": "tests.project", "pk": 359, "fields": {"status": "Public", "description": "Test"}, "members": [480, 481, 482]}, {"model": "tests.project", "pk": 360, "fields": {"status": "Public", "description": "Test"}, "members": [184, 185, 186, 187, 188, 189]}, {"model": "tests.project", "pk": 361, "fields": {"status": "Public", "description": "Test"}, "members": [312, 313]}, {"model": "tests.project", "pk": 362, "fields": {"status": "Public", "description": "Test"}, "members": [49, 50, 51, 52, 53, 54, 55]}, {"model": "tests.project", "pk": 363, "fields": {"status": "Public", "description": "Test"}, "members": [123, 124, 125, 126]}, {"model": "tests.project", "pk": 364, "fields": {"status": "Public", "description": "Test"}, "members": [148, 149, 150, 151, 152, 153, 154, 155, 156, 157]}, {"model": "tests.project", "pk": 365, "fields": {"status": "Public", "description": "Test"}, "members": [279, 280, 281, 282, 283, 284]}, {"model": "tests.project", "pk": 366, "fields": {"status": "Public", "description": "Test"}, "members": [408, 409, 410, 411, 412, 413, 414, 415, 416]}, {"model": "tests.project", "pk": 367, "fields": {"status": "Public", "description": "Test"}, "members": [393, 394, 395, 396, 397, 398, 399, 400, 401]}, {"model": "tests.project", "pk": 368, "fields": {"status": "Public", "description": "Test"}, "members": [70, 71, 72, 73, 74, 75]}, {"model": "tests.project", "pk": 369, "fields": {"status": "Public", "description": "Test"}, "members": [92, 93, 94, 95, 96, 97, 98, 99, 100]}, {"model": "tests.project", "pk": 370, "fields": {"status": "Public", "description": "Test"}, "members": [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]}, {"model": "tests.project", "pk": 371, "fields": {"status": "Public", "description": "Test"}, "members": [392, 393, 394, 395, 396, 397]}, {"model": "tests.project", "pk": 372, "fields": {"status": "Public", "description": "Test"}, "members": [262, 263, 264, 265, 266]}, {"model": "tests.project", "pk": 373, "fields": {"status": "Public", "description": "Test"}, "members": [275]}, {"model": "tests.project", "pk": 374, "fields": {"status": "Public", "description": "Test"}, "members": [124, 125]}, {"model": "tests.project", "pk": 375, "fields": {"status": "Public", "description": "Test"}, "members": [16, 17, 18, 19, 20, 21, 22]}, {"model": "tests.project", "pk": 376, "fields": {"status": "Public", "description": "Test"}, "members": [480, 481, 482, 483, 484, 485, 486]}, {"model": "tests.project", "pk": 377, "fields": {"status": "Public", "description": "Test"}, "members": [88, 89, 90, 91, 92, 93]}, {"model": "tests.project", "pk": 378, "fields": {"status": "Public", "description": "Test"}, "members": [393, 394, 395, 396, 397, 398, 399]}, {"model": "tests.project", "pk": 379, "fields": {"status": "Public", "description": "Test"}, "members": [1, 2]}, {"model": "tests.project", "pk": 380, "fields": {"status": "Public", "description": "Test"}, "members": [4, 5]}, {"model": "tests.project", "pk": 381, "fields": {"status": "Public", "description": "Test"}, "members": [104, 105, 106, 107, 108, 109, 110]}, {"model": "tests.project", "pk": 382, "fields": {"status": "Public", "description": "Test"}, "members": [411, 412, 413, 414, 415, 416, 417, 418]}, {"model": "tests.project", "pk": 383, "fields": {"status": "Public", "description": "Test"}, "members": [403, 404, 405]}, {"model": "tests.project", "pk": 384, "fields": {"status": "Public", "description": "Test"}, "members": [306, 307, 308, 309, 310, 311]}, {"model": "tests.project", "pk": 385, "fields": {"status": "Public", "description": "Test"}, "members": [94, 95, 96, 97, 98, 99, 100, 101, 102, 103]}, {"model": "tests.project", "pk": 386, "fields": {"status": "Public", "description": "Test"}, "members": [212, 213, 214, 215, 216, 217, 218, 219, 220, 221]}, {"model": "tests.project", "pk": 387, "fields": {"status": "Public", "description": "Test"}, "members": [412]}, {"model": "tests.project", "pk": 388, "fields": {"status": "Public", "description": "Test"}, "members": [427, 428, 429, 430, 431, 432, 433, 434, 435]}, {"model": "tests.project", "pk": 389, "fields": {"status": "Public", "description": "Test"}, "members": [329, 330, 331, 332, 333, 334, 335, 336, 337]}, {"model": "tests.project", "pk": 390, "fields": {"status": "Public", "description": "Test"}, "members": [336, 337, 338, 339, 340]}, {"model": "tests.project", "pk": 391, "fields": {"status": "Public", "description": "Test"}, "members": [36, 37, 38, 39, 40, 41]}, {"model": "tests.project", "pk": 392, "fields": {"status": "Public", "description": "Test"}, "members": [195, 196]}, {"model": "tests.project", "pk": 393, "fields": {"status": "Public", "description": "Test"}, "members": [479]}, {"model": "tests.project", "pk": 394, "fields": {"status": "Public", "description": "Test"}, "members": [10]}, {"model": "tests.project", "pk": 395, "fields": {"status": "Public", "description": "Test"}, "members": [236, 237, 238, 239, 240]}, {"model": "tests.project", "pk": 396, "fields": {"status": "Public", "description": "Test"}, "members": [147, 148, 149, 150]}, {"model": "tests.project", "pk": 397, "fields": {"status": "Public", "description": "Test"}, "members": [485]}, {"model": "tests.project", "pk": 398, "fields": {"status": "Public", "description": "Test"}, "members": [470, 471, 472, 473, 474]}, {"model": "tests.project", "pk": 399, "fields": {"status": "Public", "description": "Test"}, "members": [457, 458, 459]}, {"model": "tests.project", "pk": 400, "fields": {"status": "Public", "description": "Test"}, "members": [457, 458, 459, 460, 461]}, {"model": "tests.project", "pk": 401, "fields": {"status": "Public", "description": "Test"}, "members": [453, 454, 455, 456, 457, 458, 459]}, {"model": "tests.project", "pk": 402, "fields": {"status": "Public", "description": "Test"}, "members": [98, 99, 100, 101, 102, 103, 104]}, {"model": "tests.project", "pk": 403, "fields": {"status": "Public", "description": "Test"}, "members": [248]}, {"model": "tests.project", "pk": 404, "fields": {"status": "Public", "description": "Test"}, "members": [353, 354, 355]}, {"model": "tests.project", "pk": 405, "fields": {"status": "Public", "description": "Test"}, "members": [149, 150, 151, 152, 153]}, {"model": "tests.project", "pk": 406, "fields": {"status": "Public", "description": "Test"}, "members": [201, 202, 203, 204, 205]}, {"model": "tests.project", "pk": 407, "fields": {"status": "Public", "description": "Test"}, "members": [397]}, {"model": "tests.project", "pk": 408, "fields": {"status": "Public", "description": "Test"}, "members": [139, 140, 141, 142, 143, 144, 145, 146, 147]}, {"model": "tests.project", "pk": 409, "fields": {"status": "Public", "description": "Test"}, "members": [274, 275, 276, 277, 278, 279, 280, 281, 282]}, {"model": "tests.project", "pk": 410, "fields": {"status": "Public", "description": "Test"}, "members": [57, 58, 59, 60, 61, 62, 63, 64, 65, 66]}, {"model": "tests.project", "pk": 411, "fields": {"status": "Public", "description": "Test"}, "members": [260, 261, 262, 263, 264, 265]}, {"model": "tests.project", "pk": 412, "fields": {"status": "Public", "description": "Test"}, "members": [63]}, {"model": "tests.project", "pk": 413, "fields": {"status": "Public", "description": "Test"}, "members": [54, 55, 56, 57]}, {"model": "tests.project", "pk": 414, "fields": {"status": "Public", "description": "Test"}, "members": [319, 320, 321, 322, 323, 324, 325, 326, 327]}, {"model": "tests.project", "pk": 415, "fields": {"status": "Public", "description": "Test"}, "members": [244, 245, 246]}, {"model": "tests.project", "pk": 416, "fields": {"status": "Public", "description": "Test"}, "members": [51, 52, 53, 54, 55, 56]}, {"model": "tests.project", "pk": 417, "fields": {"status": "Public", "description": "Test"}, "members": [126, 127, 128, 129, 130, 131]}, {"model": "tests.project", "pk": 418, "fields": {"status": "Public", "description": "Test"}, "members": [427, 428, 429, 430, 431]}, {"model": "tests.project", "pk": 419, "fields": {"status": "Public", "description": "Test"}, "members": [88, 89, 90, 91, 92, 93, 94]}, {"model": "tests.project", "pk": 420, "fields": {"status": "Public", "description": "Test"}, "members": [57, 58, 59, 60, 61, 62]}, {"model": "tests.project", "pk": 421, "fields": {"status": "Public", "description": "Test"}, "members": [390, 391]}, {"model": "tests.project", "pk": 422, "fields": {"status": "Public", "description": "Test"}, "members": [463, 464, 465, 466, 467, 468]}, {"model": "tests.project", "pk": 423, "fields": {"status": "Public", "description": "Test"}, "members": [465, 466, 467, 468]}, {"model": "tests.project", "pk": 424, "fields": {"status": "Public", "description": "Test"}, "members": [329, 330, 331, 332, 333]}, {"model": "tests.project", "pk": 425, "fields": {"status": "Public", "description": "Test"}, "members": [49, 50]}, {"model": "tests.project", "pk": 426, "fields": {"status": "Public", "description": "Test"}, "members": [179, 180, 181, 182, 183, 184, 185, 186, 187, 188]}, {"model": "tests.project", "pk": 427, "fields": {"status": "Public", "description": "Test"}, "members": [435, 436, 437, 438, 439, 440, 441, 442]}, {"model": "tests.project", "pk": 428, "fields": {"status": "Public", "description": "Test"}, "members": [236, 237, 238, 239, 240, 241, 242, 243, 244]}, {"model": "tests.project", "pk": 429, "fields": {"status": "Public", "description": "Test"}, "members": [273, 274, 275, 276]}, {"model": "tests.project", "pk": 430, "fields": {"status": "Public", "description": "Test"}, "members": [432, 433]}, {"model": "tests.project", "pk": 431, "fields": {"status": "Public", "description": "Test"}, "members": [427]}, {"model": "tests.project", "pk": 432, "fields": {"status": "Public", "description": "Test"}, "members": [368, 369, 370, 371, 372, 373, 374, 375, 376]}, {"model": "tests.project", "pk": 433, "fields": {"status": "Public", "description": "Test"}, "members": [295, 296, 297, 298, 299, 300, 301, 302]}, {"model": "tests.project", "pk": 434, "fields": {"status": "Public", "description": "Test"}, "members": [127, 128, 129, 130]}, {"model": "tests.project", "pk": 435, "fields": {"status": "Public", "description": "Test"}, "members": [214]}, {"model": "tests.project", "pk": 436, "fields": {"status": "Public", "description": "Test"}, "members": [175, 176, 177, 178, 179, 180, 181]}, {"model": "tests.project", "pk": 437, "fields": {"status": "Public", "description": "Test"}, "members": [125, 126, 127, 128, 129, 130, 131]}, {"model": "tests.project", "pk": 438, "fields": {"status": "Public", "description": "Test"}, "members": [156, 157, 158, 159, 160, 161, 162, 163]}, {"model": "tests.project", "pk": 439, "fields": {"status": "Public", "description": "Test"}, "members": [488, 489, 490, 491, 492, 493]}, {"model": "tests.project", "pk": 440, "fields": {"status": "Public", "description": "Test"}, "members": [280, 281, 282, 283, 284, 285]}, {"model": "tests.project", "pk": 441, "fields": {"status": "Public", "description": "Test"}, "members": [96, 97, 98, 99, 100, 101]}, {"model": "tests.project", "pk": 442, "fields": {"status": "Public", "description": "Test"}, "members": [146, 147, 148, 149, 150, 151, 152, 153, 154]}, {"model": "tests.project", "pk": 443, "fields": {"status": "Public", "description": "Test"}, "members": [432, 433, 434]}, {"model": "tests.project", "pk": 444, "fields": {"status": "Public", "description": "Test"}, "members": [44, 45, 46, 47, 48, 49, 50, 51, 52]}, {"model": "tests.project", "pk": 445, "fields": {"status": "Public", "description": "Test"}, "members": [273, 274, 275, 276]}, {"model": "tests.project", "pk": 446, "fields": {"status": "Public", "description": "Test"}, "members": [217, 218, 219, 220, 221, 222, 223, 224, 225]}, {"model": "tests.project", "pk": 447, "fields": {"status": "Public", "description": "Test"}, "members": [248, 249, 250, 251, 252, 253, 254, 255, 256]}, {"model": "tests.project", "pk": 448, "fields": {"status": "Public", "description": "Test"}, "members": [295, 296, 297, 298, 299]}, {"model": "tests.project", "pk": 449, "fields": {"status": "Public", "description": "Test"}, "members": [378, 379, 380, 381, 382, 383, 384]}, {"model": "tests.project", "pk": 450, "fields": {"status": "Public", "description": "Test"}, "members": [89, 90, 91, 92, 93, 94, 95]}, {"model": "tests.project", "pk": 451, "fields": {"status": "Public", "description": "Test"}, "members": [118, 119, 120, 121, 122, 123, 124, 125, 126, 127]}, {"model": "tests.project", "pk": 452, "fields": {"status": "Public", "description": "Test"}, "members": [80]}, {"model": "tests.project", "pk": 453, "fields": {"status": "Public", "description": "Test"}, "members": [303, 304, 305, 306, 307, 308, 309, 310]}, {"model": "tests.project", "pk": 454, "fields": {"status": "Public", "description": "Test"}, "members": [72, 73, 74, 75]}, {"model": "tests.project", "pk": 455, "fields": {"status": "Public", "description": "Test"}, "members": [190, 191, 192]}, {"model": "tests.project", "pk": 456, "fields": {"status": "Public", "description": "Test"}, "members": [182, 183, 184, 185, 186, 187, 188]}, {"model": "tests.project", "pk": 457, "fields": {"status": "Public", "description": "Test"}, "members": [462, 463, 464, 465, 466]}, {"model": "tests.project", "pk": 458, "fields": {"status": "Public", "description": "Test"}, "members": [366, 367, 368, 369]}, {"model": "tests.project", "pk": 459, "fields": {"status": "Public", "description": "Test"}, "members": [195, 196, 197, 198, 199, 200, 201, 202, 203]}, {"model": "tests.project", "pk": 460, "fields": {"status": "Public", "description": "Test"}, "members": [179, 180, 181, 182, 183, 184, 185, 186, 187]}, {"model": "tests.project", "pk": 461, "fields": {"status": "Public", "description": "Test"}, "members": [95, 96, 97, 98, 99, 100, 101, 102, 103, 104]}, {"model": "tests.project", "pk": 462, "fields": {"status": "Public", "description": "Test"}, "members": [90, 91, 92, 93, 94, 95, 96, 97, 98]}, {"model": "tests.project", "pk": 463, "fields": {"status": "Public", "description": "Test"}, "members": [410, 411, 412, 413, 414, 415, 416]}, {"model": "tests.project", "pk": 464, "fields": {"status": "Public", "description": "Test"}, "members": [477, 478, 479, 480]}, {"model": "tests.project", "pk": 465, "fields": {"status": "Public", "description": "Test"}, "members": [462, 463]}, {"model": "tests.project", "pk": 466, "fields": {"status": "Public", "description": "Test"}, "members": [473, 474]}, {"model": "tests.project", "pk": 467, "fields": {"status": "Public", "description": "Test"}, "members": [247, 248, 249, 250, 251, 252, 253, 254, 255, 256]}, {"model": "tests.project", "pk": 468, "fields": {"status": "Public", "description": "Test"}, "members": [32, 33, 34, 35, 36, 37, 38]}, {"model": "tests.project", "pk": 469, "fields": {"status": "Public", "description": "Test"}, "members": [431, 432, 433, 434]}, {"model": "tests.project", "pk": 470, "fields": {"status": "Public", "description": "Test"}, "members": [399, 400, 401, 402, 403, 404, 405]}, {"model": "tests.project", "pk": 471, "fields": {"status": "Public", "description": "Test"}, "members": [334]}, {"model": "tests.project", "pk": 472, "fields": {"status": "Public", "description": "Test"}, "members": [362]}, {"model": "tests.project", "pk": 473, "fields": {"status": "Public", "description": "Test"}, "members": [481, 482]}, {"model": "tests.project", "pk": 474, "fields": {"status": "Public", "description": "Test"}, "members": [247, 248, 249, 250, 251, 252, 253, 254, 255]}, {"model": "tests.project", "pk": 475, "fields": {"status": "Public", "description": "Test"}, "members": [283, 284, 285, 286, 287]}, {"model": "tests.project", "pk": 476, "fields": {"status": "Public", "description": "Test"}, "members": [178, 179]}, {"model": "tests.project", "pk": 477, "fields": {"status": "Public", "description": "Test"}, "members": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]}, {"model": "tests.project", "pk": 478, "fields": {"status": "Public", "description": "Test"}, "members": [46, 47, 48, 49, 50, 51, 52, 53, 54]}, {"model": "tests.project", "pk": 479, "fields": {"status": "Public", "description": "Test"}, "members": [292, 293, 294, 295, 296, 297, 298, 299]}, {"model": "tests.project", "pk": 480, "fields": {"status": "Public", "description": "Test"}, "members": [113]}, {"model": "tests.project", "pk": 481, "fields": {"status": "Public", "description": "Test"}, "members": [112, 113, 114, 115, 116, 117, 118]}, {"model": "tests.project", "pk": 482, "fields": {"status": "Public", "description": "Test"}, "members": [244, 245, 246, 247, 248, 249, 250, 251, 252]}, {"model": "tests.project", "pk": 483, "fields": {"status": "Public", "description": "Test"}, "members": [422, 423, 424, 425, 426]}, {"model": "tests.project", "pk": 484, "fields": {"status": "Public", "description": "Test"}, "members": [127, 128, 129, 130, 131]}, {"model": "tests.project", "pk": 485, "fields": {"status": "Public", "description": "Test"}, "members": [319, 320, 321, 322, 323, 324, 325]}, {"model": "tests.project", "pk": 486, "fields": {"status": "Public", "description": "Test"}, "members": [455, 456]}, {"model": "tests.project", "pk": 487, "fields": {"status": "Public", "description": "Test"}, "members": [439, 440, 441, 442, 443]}, {"model": "tests.project", "pk": 488, "fields": {"status": "Public", "description": "Test"}, "members": [436, 437, 438]}, {"model": "tests.project", "pk": 489, "fields": {"status": "Public", "description": "Test"}, "members": [393, 394, 395, 396, 397, 398, 399, 400]}, {"model": "tests.project", "pk": 490, "fields": {"status": "Public", "description": "Test"}, "members": [468, 469, 470, 471, 472, 473, 474, 475, 476, 477]}, {"model": "tests.project", "pk": 491, "fields": {"status": "Public", "description": "Test"}, "members": [275, 276, 277, 278, 279, 280]}, {"model": "tests.project", "pk": 492, "fields": {"status": "Public", "description": "Test"}, "members": [250, 251, 252, 253, 254, 255, 256, 257, 258, 259]}, {"model": "tests.project", "pk": 493, "fields": {"status": "Public", "description": "Test"}, "members": [104, 105, 106, 107, 108]}, {"model": "tests.project", "pk": 494, "fields": {"status": "Public", "description": "Test"}, "members": [214]}, {"model": "tests.project", "pk": 495, "fields": {"status": "Public", "description": "Test"}, "members": [47, 48, 49, 50, 51]}, {"model": "tests.project", "pk": 496, "fields": {"status": "Public", "description": "Test"}, "members": [102]}, {"model": "tests.project", "pk": 497, "fields": {"status": "Public", "description": "Test"}, "members": [448, 449, 450, 451, 452, 453, 454, 455, 456]}, {"model": "tests.project", "pk": 498, "fields": {"status": "Public", "description": "Test"}, "members": [287, 288, 289, 290, 291, 292, 293, 294, 295]}, {"model": "tests.project", "pk": 499, "fields": {"status": "Public", "description": "Test"}, "members": [251, 252, 253, 254, 255, 256, 257, 258, 259, 260]}]
\ No newline at end of file
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractUser, Group
from django.db import models
from django.utils.datetime_safe import date
from djangoldp.models import Model
from djangoldp.permissions import AnonymousReadOnly
from djangoldp.models import Model, DynamicNestedField
from djangoldp.permissions import ACLPermissions, AuthenticatedOnly, ReadOnly, \
ReadAndCreate, AnonymousReadOnly, OwnerPermissions, InheritPermissions
from .permissions import Only2WordsForToto, ReadOnlyStartsWithA
class User(AbstractUser, Model):
class Meta(AbstractUser.Meta, Model.Meta):
ordering = ['pk']
serializer_fields = ['@id', 'username', 'first_name', 'last_name', 'email', 'userprofile',
'conversation_set','groups', 'projects', 'owned_circles']
permission_classes = [ReadAndCreate|OwnerPermissions]
rdf_type = 'foaf:user'
nested_fields = ['owned_circles']
class Skill(Model):
title = models.CharField(max_length=255, blank=True, null=True)
obligatoire = models.CharField(max_length=255)
slug = models.SlugField(blank=True, null=True, unique=True)
date = models.DateTimeField(auto_now_add=True, blank=True)
class Meta:
serializer_fields = ["@id", "title"]
def recent_jobs(self):
return self.joboffer_set.filter(date__gte=date.today())
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
serializer_fields = ["@id", "title", "recent_jobs", "slug", "obligatoire"]
nested_fields = ['joboffer_set']
lookup_field = 'slug'
rdf_type = 'hd:skill'
class JobOffer(Model):
title = models.CharField(max_length=255, blank=True, null=True)
title = models.CharField(max_length=255, null=True)
skills = models.ManyToManyField(Skill, blank=True)
slug = models.SlugField(blank=True, null=True, unique=True)
date = models.DateTimeField(auto_now_add=True, blank=True)
def recent_skills(self):
return self.skills.filter(date__gte=date.today())
class Meta:
nested_fields = ["skills"]
def some_skill(self):
return self.skills.all().first()
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AnonymousReadOnly, ReadOnly|OwnerPermissions]
serializer_fields = ["@id", "title", "skills", "recent_skills", "resources", "slug", "some_skill", "urlid"]
nested_fields = ['skills', 'resources', 'recent_skills']
container_path = "job-offers/"
lookup_field = 'slug'
rdf_type = 'hd:joboffer'
JobOffer.recent_skills.field = DynamicNestedField(Skill, 'recent_skills')
class Conversation(models.Model):
description = models.CharField(max_length=255, blank=True, null=True)
author_user = models.ForeignKey(settings.AUTH_USER_MODEL)
author_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
peer_user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="peers_conv",
on_delete=models.DO_NOTHING)
observers = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='observed_conversations')
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
nested_fields=["message_set", "observers"]
owner_field = 'author_user'
class Resource(Model):
joboffers = models.ManyToManyField(JobOffer, blank=True, related_name='resources')
description = models.CharField(max_length=255)
class Meta(Model.Meta):
ordering = ['pk']
serializer_fields = ["@id", "joboffers"]
nested_fields = ['joboffers']
depth = 1
rdf_type = 'hd:Resource'
# a resource in which only the owner has permissions (for testing owner permissions)
class OwnedResource(Model):
description = models.CharField(max_length=255, blank=True, null=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="owned_resources",
on_delete=models.CASCADE)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [OwnerPermissions]
owner_field = 'user'
serializer_fields = ['@id', 'description', 'user']
nested_fields = ['owned_resources']
depth = 1
class OwnedResourceVariant(Model):
description = models.CharField(max_length=255, blank=True, null=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="owned_variant_resources",
on_delete=models.CASCADE)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ReadOnly|OwnerPermissions]
owner_field = 'user'
serializer_fields = ['@id', 'description', 'user']
depth = 1
class OwnedResourceNestedOwnership(Model):
description = models.CharField(max_length=255, blank=True, null=True)
parent = models.ForeignKey(OwnedResource, blank=True, null=True, related_name="owned_resources",
on_delete=models.CASCADE)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [OwnerPermissions]
owner_field = 'parent__user'
serializer_fields = ['@id', 'description', 'parent']
nested_fields = ['owned_resources']
depth = 1
class OwnedResourceTwiceNestedOwnership(Model):
description = models.CharField(max_length=255, blank=True, null=True)
parent = models.ForeignKey(OwnedResourceNestedOwnership, blank=True, null=True, related_name="owned_resources",
on_delete=models.CASCADE)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [OwnerPermissions]
owner_field = 'parent__parent__user'
serializer_fields = ['@id', 'description', 'parent']
depth = 1
class UserProfile(Model):
description = models.CharField(max_length=255, blank=True, null=True)
user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='userprofile', on_delete=models.CASCADE)
slug = models.SlugField(blank=True, null=True, unique=True)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AuthenticatedOnly,ReadOnly|OwnerPermissions]
owner_field = 'user'
lookup_field = 'slug'
serializer_fields = ['@id', 'description', 'settings', 'user']
depth = 1
class NotificationSetting(Model):
user = models.OneToOneField(UserProfile, on_delete=models.CASCADE, related_name="settings")
receiveMail = models.BooleanField(default=True)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ReadAndCreate|OwnerPermissions]
class Message(models.Model):
text = models.CharField(max_length=255, blank=True, null=True)
conversation = models.ForeignKey(Conversation, on_delete=models.DO_NOTHING)
author_user = models.ForeignKey(settings.AUTH_USER_MODEL)
author_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
class Dummy(models.Model):
some = models.CharField(max_length=255, blank=True, null=True)
slug = models.SlugField(blank=True, null=True, unique=True)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
class LDPDummy(Model):
some = models.CharField(max_length=255, blank=True, null=True)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
nested_fields = ['anons']
# model used in django-guardian permission tests (no permission to anyone except suuperusers)
class PermissionlessDummy(Model):
some = models.CharField(max_length=255, blank=True, null=True)
slug = models.SlugField(blank=True, null=True, unique=True)
parent = models.ForeignKey(LDPDummy, on_delete=models.DO_NOTHING, related_name="anons", blank=True, null=True)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ACLPermissions]
lookup_field='slug'
permissions = (('custom_permission_permissionlessdummy', 'Custom Permission'),)
class Post(Model):
content = models.CharField(max_length=255)
author = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
peer_user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="peers_post",
on_delete=models.SET_NULL)
class Meta(Model.Meta):
ordering = ['pk']
auto_author = 'author'
rdf_type = 'hd:post'
class AnonymousReadOnlyPost(Model):
content = models.CharField(max_length=255)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AnonymousReadOnly]
class AuthenticatedOnlyPost(Model):
content = models.CharField(max_length=255)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [AuthenticatedOnly]
class ReadOnlyPost(Model):
content = models.CharField(max_length=255)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ReadOnly]
class ReadAndCreatePost(Model):
content = models.CharField(max_length=255)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ReadAndCreate]
class ANDPermissionsDummy(Model):
title = models.CharField(max_length=255)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ReadOnlyStartsWithA&Only2WordsForToto]
class ORPermissionsDummy(Model):
title = models.CharField(max_length=255)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ReadOnlyStartsWithA|Only2WordsForToto]
class Invoice(Model):
title = models.CharField(max_length=255, blank=True, null=True)
date = models.DateField(blank=True, null=True)
class Meta:
class Meta(Model.Meta):
ordering = ['pk']
depth = 2
permission_classes = [AnonymousReadOnly]
nested_fields = ["batches"]
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
nested_fields = ['batches']
class Circle(Model):
name = models.CharField(max_length=255, blank=True)
description = models.CharField(max_length=255, blank=True)
owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="owned_circles", on_delete=models.DO_NOTHING, null=True, blank=True)
members = models.OneToOneField(Group, related_name="circle", on_delete=models.SET_NULL, null=True, blank=True)
admins = models.OneToOneField(Group, related_name="admin_circle", on_delete=models.SET_NULL, null=True, blank=True)
class Meta(Model.Meta):
ordering = ['pk']
auto_author = 'owner'
depth = 1
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions|ACLPermissions]
permission_roles = {
'members': {'perms': ['view'], 'add_author': True},
'admins': {'perms': ['view', 'change', 'control'], 'add_author': True},
}
serializer_fields = ['@id', 'name', 'description', 'members', 'owner', 'space']
rdf_type = 'hd:circle'
Group._meta.inherit_permissions += ['circle','admin_circle']
Group._meta.serializer_fields += ['circle', 'admin_circle']
class RestrictedCircle(Model):
name = models.CharField(max_length=255, blank=True)
description = models.CharField(max_length=255, blank=True)
owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="owned_restrictedcircles", on_delete=models.DO_NOTHING, null=True, blank=True)
members = models.ForeignKey(Group, related_name="restrictedcircles", on_delete=models.SET_NULL, null=True, blank=True)
admins = models.ForeignKey(Group, related_name="admin_restrictedcircles", on_delete=models.SET_NULL, null=True, blank=True)
class Meta(Model.Meta):
ordering = ['pk']
auto_author = 'owner'
permission_classes = [ACLPermissions]
permission_roles = {
'members': {'perms': ['view'], 'add_author': True},
'admins': {'perms': ['view', 'change', 'control'], 'add_author': True},
}
rdf_type = 'hd:circle'
class RestrictedResource(Model):
content = models.CharField(max_length=255, blank=True)
circle = models.ForeignKey(RestrictedCircle, on_delete=models.CASCADE)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [InheritPermissions]
inherit_permissions = ['circle']
class DoubleInheritModel(Model):
content = models.CharField(max_length=255, blank=True)
ro_ancestor = models.ForeignKey(ReadOnlyPost, on_delete=models.CASCADE, null=True, blank=True)
circle = models.ForeignKey(RestrictedCircle, on_delete=models.CASCADE, null=True, blank=True)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [InheritPermissions]
inherit_permissions = ['circle', 'ro_ancestor']
class Space(Model):
name = models.CharField(max_length=255, blank=True)
circle = models.OneToOneField(to=Circle, null=True, blank=True, on_delete=models.CASCADE, related_name='space')
class Meta(Model.Meta):
ordering = ['pk']
class Batch(Model):
invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE, related_name='batches')
title = models.CharField(max_length=255, blank=True, null=True)
class Meta:
class Meta(Model.Meta):
ordering = ['pk']
serializer_fields = ['@id', 'title', 'invoice', 'tasks']
nested_fields = ["tasks", 'invoice']
permission_classes = [ReadAndCreate|OwnerPermissions]
depth = 1
rdf_type = 'hd:batch'
class Task(models.Model):
batch = models.ForeignKey(Batch, on_delete=models.CASCADE, related_name='tasks')
title = models.CharField(max_length=255)
class Meta:
class Meta(Model.Meta):
ordering = ['pk']
serializer_fields = ['@id', 'title', 'batch']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
class Post(Model):
content = models.CharField(max_length=255)
author = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True)
class ModelTask(Model, Task):
class Meta(Model.Meta):
ordering = ['pk']
class Meta:
auto_author = 'author'
STATUS_CHOICES = [
('Public', 'Public'),
('Private', 'Private'),
('Archived', 'Archived'),
]
class Project(Model):
description = models.CharField(max_length=255, null=True, blank=False)
status = models.CharField(max_length=8, choices=STATUS_CHOICES, default='Private', null=True, blank=True)
members = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='projects')
class Meta(Model.Meta):
ordering = ['pk']
rdf_type = 'hd:project'
nested_fields = ['members']
class DateModel(Model):
excluded = models.CharField(max_length=255, null=True, default='test')
value = models.DateField()
class Meta(Model.Meta):
ordering = ['pk']
rdf_type = "hd:date"
serializer_fields_exclude = ['excluded']
class DateChild(Model):
parent = models.ForeignKey(DateModel, on_delete=models.CASCADE, related_name='children')
class Meta(Model.Meta):
ordering = ['pk']
rdf_type = 'hd:datechild'
class MyAbstractModel(Model):
defaultsomething = models.CharField(max_length=255, blank=True)
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ACLPermissions]
abstract = True
rdf_type = "wow:defaultrdftype"
get_user_model()._meta.serializer_fields = ['@id', 'username', 'first_name', 'last_name', 'email', 'conversation_set']
class NoSuperUsersAllowedModel(Model):
class Meta(Model.Meta):
ordering = ['pk']
permission_classes = [ACLPermissions]
\ No newline at end of file
Machine,Date,Auth,WithPermsCache,volume,test+AF8-get+AF8-resource,test+AF8-get+AF8-container,test+AF8-get+AF8-filtered+AF8-fields,test+AF8-get+AF8-reverse+AF8-filtered+AF8-fields,test+AF8-get+AF8-nested,test+AF8-get+AF8-users+AF8-container,Prefetch,default depth
jbl+AC0-T440p,Sep 22 2020 10:50:51,False,False,200,0.003339644670486,0.006944504976273,0.038935685157776,0.024031536579132,0.000708421468735,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:51:46,False,False,200,0.0035072016716,0.006944673061371,0.039835988283157,0.025360778570175,0.000757339000702,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:52:42,False,False,200,0.003284044265747,0.006942090988159,0.038870732784271,0.023859632015228,0.000705161094666,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:53:16,False,False,100,0.003656179904938,0.005776383876801,0.025797350406647,0.01539302110672,0.000770201683044,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:53:33,False,False,100,0.003554759025574,0.005703027248383,0.024777753353119,0.015221126079559,0.000770528316498,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:53:49,False,False,100,0.003367004394531,0.005602278709412,0.023594326972962,0.014168989658356,0.000726828575134,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:54:03,False,False,50,0.003355793952942,0.005232772827148,0.016062431335449,0.009248399734497,0.000776686668396,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:54:09,False,False,50,0.003454508781433,0.005315055847168,0.016247057914734,0.009447617530823,0.00073832988739,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:54:15,False,False,50,0.003420171737671,0.005717425346375,0.016275815963745,0.009424614906311,0.001325125694275,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:57:41,False,False,300,0.003357520103455,0.009047945340474,0.055130259990692,0.033688295682271,0.000706691741943,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 10:59:35,False,False,300,0.003680046399434,0.009138919512431,0.056478141943614,0.0363059147199,0.000769446690877,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 11:01:29,False,False,300,0.003643860816956,0.008885918458303,0.059775860309601,0.035221153100332,0.000756018956502,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 11:47:40,False,False,100,0.003384988307953,0.006034939289093,0.024095425605774,0.014140074253082,0.000722093582153,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 11:47:57,False,False,100,0.003611071109772,0.005775241851807,0.023724327087402,0.014749829769135,0.000745611190796,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 11:48:15,False,False,100,0.003316740989685,0.005551462173462,0.023505146503449,0.014274184703827,0.000737235546112,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 11:51:06,False,False,200,0.003252120018005,0.006922056674957,0.038872839212418,0.025012502670288,0.000715854167938,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 11:52:07,False,False,200,0.003315222263336,0.007173013687134,0.039467182159424,0.0239526450634,0.000736322402954,,FALSE,0
jbl+AC0-T440p,Sep 22 2020 11:53:59,False,False,200,0.003276619911194,0.006898198127747,0.038627609014511,0.023467609882355,0.000708512067795,,FALSE,0
jbl+AC0-T440p,Sep 23 2020 15:19:39,True,False,100,0.006617827415466,0.245147013664246,0.261345520019531,0.209938230514526,0.001274492740631,0.01203465461731,TRUE,0
jbl+AC0-T440p,Sep 23 2020 15:23:58,True,False,100,0.006518981456757,0.263970799446106,0.139407794475555,0.113074848651886,0.001235642433167,0.642078399658203,TRUE,0
jbl+AC0-T440p,Sep 23 2020 15:25:33,True,False,100,0.006539282798767,0.263329057693481,0.143536510467529,0.115545327663422,0.00125715970993,0.520937442779541,TRUE,0
jbl+AC0-T440p,Sep 23 2020 15:47:31,True,True,100,0.003864502906799,0.019258742332459,0.01636646270752,0.008915212154388,0.000782597064972,0.354249000549316,TRUE,0
jbl+AC0-T440p,Sep 23 2020 15:48:30,True,True,100,0.003590517044067,0.019879310131073,0.016916983127594,0.009615495204926,0.000798478126526,0.364127635955811,TRUE,0
jbl+AC0-T440p,Sep 23 2020 15:49:19,True,True,100,0.003716588020325,0.023860175609589,0.016380727291107,0.009003615379334,0.000774307250977,0.35044002532959,TRUE,0
jbl+AC0-T440p,Sep 23 2020 16:56:57,True,True,100,0.004425497055054,0.019956090450287,0.017114706039429,0.010911240577698,0.000832149982452,0.336694478988647,TRUE,0
jbl+AC0-T440p,Sep 23 2020 16:57:23,True,True,100,0.004397692680359,0.021222379207611,0.01826550245285,0.010625832080841,0.000812151432037,0.344640016555786,TRUE,0
jbl+AC0-T440p,Sep 23 2020 16:57:45,True,True,100,0.004602279663086,0.020297501087189,0.017129955291748,0.010850946903229,0.000865814685822,0.339866161346436,TRUE,0
jbl+AC0-T440p,Sep 23 2020 16:58:37,True,True,200,0.004463336467743,0.036689649820328,0.025502071380615,0.015932221412659,0.000898872613907,0.681740045547485,TRUE,0
jbl+AC0-T440p,Sep 23 2020 16:59:37,True,True,200,0.004517335891724,0.036278907060623,0.025654143095017,0.01576028585434,0.000849905014038,0.660790681838989,TRUE,0
jbl+AC0-T440p,Sep 23 2020 17:14:05,True,False,100,0.006808481216431,0.252511320114136,0.139744215011597,0.111351528167725,0.001188087463379,0.564764976501465,TRUE,0
jbl+AC0-T440p,Sep 23 2020 17:16:58,True,False,100,0.006502165794373,0.242799952030182,0.137602522373199,0.108403618335724,0.001143708229065,0.556174516677856,TRUE,0
jbl+AC0-T440p,Sep 24 2020 06:53:53,True,False,100,0.007479875087738,0.252197952270508,0.141312582492828,0.109222292900085,0.001601278781891,0.52592396736145,TRUE,0
jbl+AC0-T440p,Sep 24 2020 06:56:06,True,False,100,0.020340206623077,1.31586099863052,0.729812262058258,0.577438371181488,0.00078241109848,1.78533124923706,FALSE,0
jbl+AC0-T440p,Sep 24 2020 07:04:00,True,False,100,0.006233677864075,0.242916750907898,0.135480484962463,0.10392139673233,0.000762076377869,0.569819927215576,TRUE,0
jbl+AC0-T440p,Sep 24 2020 07:05:19,True,True,100,0.006471273899078,0.023659512996674,0.020732533931732,0.015365273952484,0.000769484043121,0.549034357070923,FALSE,0
jbl+AC0-T440p,Sep 24 2020 07:05:50,True,True,100,0.005183663368225,0.021180493831635,0.016473467350006,0.010494797229767,0.000771188735962,0.321053028106689,TRUE,0
jbl+AC0-T440p,Sep 24 2020 07:33:51,True,True,100,0.004018228054047,0.019896368980408,0.024588730335236,0.015463829040527,0.000797684192657,0.375835657119751,TRUE,0
jbl+AC0-T440p,Oct 08 2020 15:01:01,True,True,100,0.004086337089539,0.022444577217102,1.26581408977509,0.014725821018219,0.002466685771942,0.310548305511475,TRUE,1
jbl+AC0-T440p,Oct 08 2020 15:25:42,True,True,100,0.004928917884827,0.020494124889374,1.19440255403519,0.01545866727829,0.000807287693024,0.304153442382812,TRUE,1
jbl+AC0-T440p,Oct 08 2020 15:44:13,True,True,100,0.00410740852356,0.020648219585419,1.24338629007339,0.01569117307663,0.00077033996582,0.33369255065918,TRUE,1
jbl+AC0-T440p,Oct 08 2020 16:19:05,True,True,100,0.004798595905304,0.022070643901825,1.24563392400742,0.015214123725891,0.000787632465363,0.333659410476685,TRUE,1
jbl+AC0-T440p,Oct 09 2020 11:23:54,True,True,100,0.004018263816834,0.020824022293091,1.16614150524139,0.015614166259766,0.000755190849304,0.34318208694458,TRUE,1
jbl+AC0-T440p,Oct 09 2020 11:54:15,True,True,100,0.003045120239258,0.005557940006256,0.009205477237701,0.003398790359497,0.00073746919632,0.356267929077148,TRUE,1
jbl+AC0-T440p,Oct 09 2020 11:56:19,True,True,100,0.003119325637817,0.005602471828461,0.009082851409912,0.003396863937378,0.000744948387146,0.303446769714356,TRUE,2
jbl+AC0-T440p,Oct 09 2020 11:58:22,True,True,100,0.003008058071136,0.005401248931885,0.010658957958222,0.003909242153168,0.000718443393707,0.301162958145142,TRUE,3
jbl+AC0-T440p,Oct 09 2020 11:59:16,True,True,100,0.003015418052673,0.005526115894318,0.010740044116974,0.00400491476059,0.000724492073059,0.313828229904175,TRUE,4
jbl+AC0-T440p,Oct 09 2020 12:00:32,True,True,100,0.002969658374786,0.005434756278992,0.018136837482452,0.003030817508698,0.000726938247681,0.320115327835083,TRUE,0
jbl+AC0-T440p,Oct 09 2020 12:21:00,True,True,100,0.003493466377258,0.006103293895721,0.01923253774643,0.003091294765472,0.000737550258636,0.369867086410522,TRUE,0
jbl+AC0-T440p,Oct 15 2020 22:00:10,True,True,100,0.003004941940308,0.00546817779541,0.018348352909088,0.003068554401398,0.000729415416718,0.320573329925537,TRUE,0
jbl+AC0-T440p,Oct 15 2020 22:15:26,True,True,100,0.003350086212158,0.005898218154907,0.011625332832337,0.004264788627625,0.000795011520386,0.319289922714233,TRUE,1
import sys
import yaml
import django
from django.conf import settings as django_settings
from djangoldp.conf.ldpsettings import LDPSettings
from djangoldp.tests.server_settings import yaml_config
# load test config
config = yaml.safe_load(yaml_config)
ldpsettings = LDPSettings(config)
django_settings.configure(ldpsettings,
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': None
},
ANONYMOUS_USER_NAME=None)
django.setup()
from django.test.runner import DiscoverRunner
test_runner = DiscoverRunner(verbosity=1)
failures = test_runner.run_tests([
# 'djangoldp.tests.tests_performance',
'djangoldp.tests.tests_perf_get'
])
if failures:
sys.exit(failures)