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 2088 additions and 514 deletions
[{"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
import json
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import AbstractUser, Group
from django.db import models
from django.db.models import BinaryField, DateField
from django.utils.datetime_safe import date
from djangoldp.fields import LDPUrlField
from djangoldp.models import Model
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 User(AbstractUser, Model):
class Meta(AbstractUser.Meta, Model.Meta):
ordering = ['pk']
serializer_fields = ['@id', 'username', 'first_name', 'last_name', 'email', 'userprofile',
'conversation_set', 'circle_set', 'projects']
anonymous_perms = ['view', 'add']
authenticated_perms = ['inherit', 'change']
owner_perms = ['inherit']
nested_fields = ['circles', 'projects']
'conversation_set','groups', 'projects', 'owned_circles']
permission_classes = [ReadAndCreate|OwnerPermissions]
rdf_type = 'foaf:user'
nested_fields = ['owned_circles']
class Skill(Model):
......@@ -30,11 +30,12 @@ class Skill(Model):
return self.joboffer_set.filter(date__gte=date.today())
class Meta(Model.Meta):
anonymous_perms = ['view']
authenticated_perms = ['inherit', 'add']
owner_perms = ['inherit', 'change', 'delete', 'control']
serializer_fields = ["@id", "title", "recent_jobs", "slug"]
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):
......@@ -50,24 +51,28 @@ class JobOffer(Model):
return self.skills.all().first()
class Meta(Model.Meta):
anonymous_perms = ['view']
authenticated_perms = ['inherit', 'change', 'add']
owner_perms = ['inherit', 'delete', 'control']
nested_fields = ["skills"]
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)
peer_user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="peers_conv")
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):
anonymous_perms = ['view']
authenticated_perms = ['inherit', 'add']
owner_perms = ['inherit', 'change', 'delete', 'control']
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
nested_fields=["message_set", "observers"]
owner_field = 'author_user'
......@@ -76,34 +81,99 @@ class Resource(Model):
description = models.CharField(max_length=255)
class Meta(Model.Meta):
anonymous_perms = ['view', 'add', 'delete', 'change', 'control']
authenticated_perms = ['inherit']
owner_perms = ['inherit']
ordering = ['pk']
serializer_fields = ["@id", "joboffers"]
nested_fields = ["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)
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):
anonymous_perms = ['view']
authenticated_perms = ['inherit']
owner_perms = ['inherit', 'change', 'control']
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):
anonymous_perms = ['view']
authenticated_perms = ['inherit', 'add']
owner_perms = ['inherit', 'change', 'delete', 'control']
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
class Dummy(models.Model):
......@@ -111,32 +181,74 @@ class Dummy(models.Model):
slug = models.SlugField(blank=True, null=True, unique=True)
class Meta(Model.Meta):
anonymous_perms = ['view']
authenticated_perms = ['inherit', 'add']
owner_perms = ['inherit', 'change', 'delete', 'control']
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
class LDPDummy(Model):
some = models.CharField(max_length=255, blank=True, null=True)
class Meta(Model.Meta):
anonymous_perms = ['view']
authenticated_perms = ['inherit', 'add']
owner_perms = ['inherit', 'change', 'delete', 'control']
ordering = ['pk']
permission_classes = [AnonymousReadOnly,ReadAndCreate|OwnerPermissions]
nested_fields = ['anons']
# model used in django-guardian permission tests (no anonymous etc permissions set)
# 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):
anonymous_perms = []
authenticated_perms = []
owner_perms = []
permissions = (
('custom_permission_permissionlessdummy', 'Custom Permission'),
)
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):
......@@ -144,11 +256,73 @@ class Invoice(Model):
date = models.DateField(blank=True, null=True)
class Meta(Model.Meta):
ordering = ['pk']
depth = 2
anonymous_perms = ['view']
authenticated_perms = ['inherit', 'add']
owner_perms = ['inherit', 'change', 'delete', 'control']
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):
......@@ -156,12 +330,11 @@ class Batch(Model):
title = models.CharField(max_length=255, blank=True, null=True)
class Meta(Model.Meta):
ordering = ['pk']
serializer_fields = ['@id', 'title', 'invoice', 'tasks']
anonymous_perms = ['view', 'add']
authenticated_perms = ['inherit', 'add']
owner_perms = ['inherit', 'change', 'delete', 'control']
nested_fields = ["tasks", 'invoice']
permission_classes = [ReadAndCreate|OwnerPermissions]
depth = 1
rdf_type = 'hd:batch'
class Task(models.Model):
......@@ -169,58 +342,61 @@ class Task(models.Model):
title = models.CharField(max_length=255)
class Meta(Model.Meta):
ordering = ['pk']
serializer_fields = ['@id', 'title', 'batch']
anonymous_perms = ['view']
authenticated_perms = ['inherit', 'add']
owner_perms = ['inherit', 'change', 'delete', 'control']
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)
peer_user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="peers_post")
class ModelTask(Model, Task):
class Meta(Model.Meta):
auto_author = 'author'
anonymous_perms = ['view', 'add', 'delete', 'add', 'change', 'control']
authenticated_perms = ['inherit']
owner_perms = ['inherit']
ordering = ['pk']
STATUS_CHOICES = [
('Public', 'Public'),
('Private', 'Private'),
('Archived', 'Archived'),
]
class Circle(Model):
class Project(Model):
description = models.CharField(max_length=255, null=True, blank=False)
team = models.ManyToManyField(settings.AUTH_USER_MODEL, through="CircleMember", blank=True)
owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="owned_circles", on_delete=models.DO_NOTHING,
null=True, blank=True)
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):
nested_fields = ["team"]
anonymous_perms = ['view', 'add', 'delete', 'add', 'change', 'control']
authenticated_perms = ["inherit"]
rdf_type = 'hd:circle'
depth = 1
ordering = ['pk']
rdf_type = 'hd:project'
nested_fields = ['members']
class CircleMember(Model):
circle = models.ForeignKey(Circle, on_delete=models.CASCADE, related_name='members')
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="circles")
is_admin = models.BooleanField(default=False)
class DateModel(Model):
excluded = models.CharField(max_length=255, null=True, default='test')
value = models.DateField()
class Meta(Model.Meta):
container_path = "circle-members/"
anonymous_perms = ['view', 'add', 'delete', 'add', 'change', 'control']
authenticated_perms = ['inherit']
unique_together = ['user', 'circle']
rdf_type = 'hd:circlemember'
ordering = ['pk']
rdf_type = "hd:date"
serializer_fields_exclude = ['excluded']
class Project(Model):
description = models.CharField(max_length=255, null=True, blank=False)
team = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='projects')
class DateChild(Model):
parent = models.ForeignKey(DateModel, on_delete=models.CASCADE, related_name='children')
class Meta(Model.Meta):
nested_fields = ["team"]
anonymous_perms = ['view', 'add', 'delete', 'add', 'change', 'control']
authenticated_perms = ["inherit"]
rdf_type = 'hd:project'
depth = 1
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"
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)
from djangoldp.filters import BaseFilterBackend
from djangoldp.permissions import LDPBasePermission
class StartsWithAFilter(BaseFilterBackend):
"""Only objects whose title starts in A get through"""
def filter_queryset(self, request, queryset, view):
return queryset.filter(title__startswith='A')
class ReadOnlyStartsWithA(LDPBasePermission):
"""Only gives read-only access and only to objects which title starts with A"""
filter_backend = StartsWithAFilter
permissions = {'view', 'list'}
def check_perms(self, obj):
return getattr(obj, 'title', '').startswith('A')
def has_object_permission(self, request, view, obj=None):
return self.check_perms(obj)
def get_permissions(self, user, model, obj=None):
return self.permissions if self.check_perms(obj) else set()
class ContainsSpace(BaseFilterBackend):
"""Only objects whose title contains a space get through"""
def filter_queryset(self, request, queryset, view):
if request.user.username != 'toto':
return queryset.none()
return queryset.filter(title__contains=' ')
class Only2WordsForToto(LDPBasePermission):
"""Only gives access if the user's username is toto and only to objects whose title has two words (contains space)"""
filter_backend = ContainsSpace
def has_permission(self, request, view):
return request.user.username == 'toto'
def check_perms(self, obj):
return ' ' in getattr(obj, 'title', '')
def has_object_permission(self, request, view, obj=None):
return self.check_perms(obj)
def get_permissions(self, user, model, obj=None):
return self.permissions if self.check_perms(obj) else set()
\ No newline at end of file
import sys
import yaml
import django
from django.conf import settings
from django.conf import settings as django_settings
from djangoldp.conf.ldpsettings import LDPSettings
from djangoldp.tests.server_settings import yaml_config
settings.configure(DEBUG=False,
ALLOWED_HOSTS=["*"],
DATABASES={
'default': {
'ENGINE': 'django.db.backends.sqlite3',
}
},
LDP_RDF_CONTEXT={
"@context": {
"@vocab": "http://happy-dev.fr/owl/#",
"foaf": "http://xmlns.com/foaf/0.1/",
"doap": "http://usefulinc.com/ns/doap#",
"ldp": "http://www.w3.org/ns/ldp#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"geo": "http://www.w3.org/2003/01/geo/wgs84_pos#",
"acl": "http://www.w3.org/ns/auth/acl#",
"name": "rdfs:label",
"website": "foaf:homepage",
"deadline": "xsd:dateTime",
"lat": "geo:lat",
"lng": "geo:long",
"jabberID": "foaf:jabberID",
"permissions": "acl:accessControl",
"mode": "acl:mode",
"view": "acl:Read",
"change": "acl:Write",
"add": "acl:Append",
"delete": "acl:Delete",
"control": "acl:Control"
}
},
AUTH_USER_MODEL='tests.User',
ANONYMOUS_USER_NAME = None,
AUTHENTICATION_BACKENDS=(
'django.contrib.auth.backends.ModelBackend', 'guardian.backends.ObjectPermissionBackend'),
ROOT_URLCONF='djangoldp.urls',
DJANGOLDP_PACKAGES=['djangoldp.tests'],
INSTALLED_APPS=('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.admin',
'guardian',
'djangoldp',
'djangoldp.tests',
),
SEND_BACKLINKS=False,
SITE_URL='http://happy-dev.fr',
BASE_URL='http://happy-dev.fr',
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'djangoldp.pagination.LDPPagination',
'PAGE_SIZE': 5
},
)
# load test config
config = yaml.safe_load(yaml_config)
ldpsettings = LDPSettings(config)
django_settings.configure(ldpsettings)
django.setup()
from django.test.runner import DiscoverRunner
......@@ -65,11 +17,15 @@ from django.test.runner import DiscoverRunner
test_runner = DiscoverRunner(verbosity=1)
failures = test_runner.run_tests([
'djangoldp.tests.tests_settings',
'djangoldp.tests.tests_ldp_model',
'djangoldp.tests.tests_save',
'djangoldp.tests.tests_model_serializer',
'djangoldp.tests.tests_ldp_viewset',
'djangoldp.tests.tests_user_permissions',
'djangoldp.tests.tests_guardian',
'djangoldp.tests.tests_anonymous_permissions',
'djangoldp.tests.tests_permissions',
'djangoldp.tests.tests_post',
'djangoldp.tests.tests_update',
'djangoldp.tests.tests_auto_author',
'djangoldp.tests.tests_get',
......@@ -77,7 +33,8 @@ failures = test_runner.run_tests([
'djangoldp.tests.tests_sources',
'djangoldp.tests.tests_pagination',
'djangoldp.tests.tests_inbox',
#'djangoldp.tests.tests_temp'
'djangoldp.tests.tests_backlinks_service',
'djangoldp.tests.tests_cache'
])
if failures:
sys.exit(failures)
import json
import argparse
from pathlib import Path
from datetime import datetime
from utils import generate_users, generate_projects, generate_skills
'''
A script which generates and outputs random production data, into a parameterised file (json), which can be used as
a Django fixture or imported into a live database
e.g. python manage.py loaddata fixture.json
for help run python prod_data_generator.py -h
'''
# starting from offset ensures that existing users etc are not disturbed
parser = argparse.ArgumentParser(description='generates and outputs random test data, into a file used by the performance unit tests')
parser.add_argument(dest='count', metavar='N', type=int, help='the number of users (and projects) to generate')
parser.add_argument('--offset', dest='offset', type=int, default=100, help='an offset to start primary keys at (should be larger than the largest pre-existing project/user primary key)')
parser.add_argument('-f', dest='file_dest', type=str, default="../fixtures/live.json", help='the file destination to write to')
parser.add_argument('-s', dest='generate_skills', type=bool, default=False, help='Do you want to generate skills too ?')
args = parser.parse_args()
count = args.count
OFFSET = args.offset
user_template = {
'model': 'djangoldp_account.ldpuser',
'pk': 0,
'fields': {
'username': 'john',
'email': 'jlennon@c.coop',
'password':'glassonion',
'first_name': 'John',
'last_name': 'Lennon'
}
}
project_template = {
'model': 'djangoldp_project.project',
'pk': 0,
'fields': {
'description': 'Test',
'status': 'Public',
'creationDate': str(datetime.date(datetime.now()))
}
}
skill_template = {
'model': 'djangoldp_skill.skill',
'pk': 0,
'fields': {
'name': 'PHP',
}
}
fixture = generate_users(count, user_template, offset=OFFSET)
fixture = generate_projects(count, project_template, fixture=fixture, offset=OFFSET)
if args.generate_skills:
fixture = generate_skills(count, skill_template, fixture=fixture, offset=OFFSET)
with open(Path(__file__).parent / args.file_dest, 'w') as output:
json.dump(fixture, output)
print(str(count))
Source diff could not be displayed: it is too large. Options to address this: view the blob.
import json
import argparse
from pathlib import Path
from utils import generate_users, generate_projects
'''
A script which generates and outputs random test data, into a file used by the performance unit tests
for help run python test_data_generator.py -h
'''
parser = argparse.ArgumentParser(description='generates and outputs random test data, into a file used by the performance unit tests')
parser.add_argument(dest='count', metavar='N', type=int, help='the number of users (and projects) to generate')
parser.add_argument('-f', dest='file_dest', type=str, default="../fixtures/test.json", help='the file destination to write to')
args = parser.parse_args()
count = args.count
user_template = {
'model': 'tests.user',
'pk': 0,
'fields': {
'username': 'john',
'email': 'jlennon@c.coop',
'password':'glassonion',
'first_name': 'John',
'last_name': 'Lennon'
}
}
project_template = {
'model': 'tests.project',
'pk': 0,
'fields': {
'status': 'Public',
'description': 'Test'
}
}
fixture = generate_users(count, user_template)
fixture = generate_projects(count, project_template, fixture=fixture, production=False)
with open(Path(__file__).parent / args.file_dest, 'w') as output:
json.dump(fixture, output)
print(str(count))
from copy import deepcopy
import random
from faker import Faker
'''
Contains definitions used in common by multiple scripts within this directory
'''
def generate_user(i, user_template):
myFactory = Faker()
user = deepcopy(user_template)
email = myFactory.unique.email().split('@')
email.insert(1, str(random.randint(0, 5)))
email.insert(2, "@")
email_str = "".join(email)
user['pk'] = i
user['fields']['username'] = myFactory.unique.user_name() + str(random.randint(0, 100))
user['fields']['email'] = email_str
user['fields']['first_name'] = myFactory.first_name()
user['fields']['last_name'] = myFactory.last_name()
return user
def generate_users(count, user_template, fixture=None, offset=0):
if fixture is None:
fixture = list()
for i in range(count):
j = offset + i
user = generate_user(j, user_template)
fixture.append(user)
return fixture
def generate_project_member_and_user_pks(project_pk, offset, total_users, max_members_per_project):
'''
returns a generator of tuples (new project member PKs and selected user PKs)
raises error if there are not enough users
'''
# we want to select a handful of random users
# to save time we just select a random user within a safe range and then grab a bunch of adjacent users
start_user_pk = random.randint(max(offset, 1), offset + (total_users - (max_members_per_project + 1)))
if start_user_pk < offset:
raise IndexError('not enough users!')
for i in range(random.randint(1, max_members_per_project)):
j = offset + (i + (project_pk * max_members_per_project)) # generate a unique integer id
user_pk = start_user_pk + i # select the next user
yield (j, user_pk)
def generate_project_members(project_pk, fixture, offset, total_users):
max_members_per_project = 10
def generate_project_member(i, user_pk):
return {
'model': 'djangoldp_project.member',
'pk': i,
'fields': {
'project': project_pk,
'user': user_pk
}
}
for (j, user_pk) in generate_project_member_and_user_pks(project_pk, offset, total_users, max_members_per_project):
fixture.append(generate_project_member(j, user_pk))
return fixture
def generate_skill(i, skill_template):
myFactory = Faker()
skill = deepcopy(skill_template)
skill['pk'] = i
skill['fields']['name'] = myFactory.unique.job()
return skill
def generate_user_pks(skill_pk, offset, total_users, max_users_per_skill):
'''
returns a generator of tuples ()
raises error if there are not enough users
'''
# we want to select a handful of random users
# to save time we just select a random user within a safe range and then grab a bunch of adjacent users
start_user_pk = random.randint(0, offset + (total_users - (max_users_per_skill + 1)))
# if start_user_pk < offset:
# raise IndexError('not enough users!')
for i in range(random.randint(1, max_users_per_skill)):
j = offset + (i + (skill_pk * max_users_per_skill)) # generate a unique integer id
user_pk = start_user_pk + i # select the next user
yield (j, user_pk)
def append_users_to_skill(skill, offset, total_users):
max_users_per_skill = 250
skill['fields']['users'] = []
for (j, user_pk) in generate_user_pks(skill['pk'], offset, total_users, max_users_per_skill):
skill['fields']['users'].append(user_pk)
return skill
def generate_skills(count, skill_template, fixture=None, offset=0):
if fixture is None:
fixture = list()
for i in range(count):
j = offset + i
skill = generate_skill(j, skill_template)
skill = append_users_to_skill(skill, offset, count)
fixture.append(skill)
return fixture
def generate_project(i, project_template):
project = deepcopy(project_template)
project['pk'] = i
return project
def append_members_to_project(project, offset, total_users):
max_members_per_project = 10
project['members'] = []
for (j, user_pk) in generate_project_member_and_user_pks(project['pk'], offset, total_users, max_members_per_project):
project['members'].append(user_pk)
return project
def generate_projects(count, project_template, fixture=None, offset=0, production=True):
if fixture is None:
fixture = list()
for i in range(count):
j = offset + i
project = generate_project(j, project_template)
# project members using direct ManyToMany field. Generate them as a field on project
if not production:
project = append_members_to_project(project, offset, count)
fixture.append(project)
# project members using Member through model, generate them as separate in the fixture
if production:
# append random number of project members, max 10 for a single project
generate_project_members(j, fixture, offset, count)
return fixture
"""
This module contains the YAML configuration for a testing djangoldp server.
"""
yaml_config = """
dependencies:
ldppackages:
- djangoldp.tests # fetch 'djangoldp.tests.djangoldp_settings'
- djangoldp.tests.dummy.apps.DummyConfig # already declared in 'djangoldp.tests'
server:
ALLOWED_HOSTS:
- '*'
AUTH_USER_MODEL: tests.User
EMAIL_HOST: somewhere
ANONYMOUS_USER_NAME: None
ROOT_URLCONF: djangoldp.urls
SEND_BACKLINKS: false
SITE_URL: http://happy-dev.fr
BASE_URL: http://happy-dev.fr
REST_FRAMEWORK:
DEFAULT_PAGINATION_CLASS: djangoldp.pagination.LDPPagination
PAGE_SIZE: 5
USE_TZ: false
SEND_BACKLINKS: false
GUARDIAN_AUTO_PREFETCH: true
SERIALIZER_CACHE: false
STORE_ACTIVITIES: VERBOSE
"""
......@@ -3,9 +3,7 @@ import json
from django.test import TestCase
from rest_framework.test import APIClient
from djangoldp.permissions import LDPPermissions
from djangoldp.tests.models import JobOffer
from djangoldp.views import LDPViewSet
class TestAnonymousUserPermissions(TestCase):
......@@ -26,6 +24,8 @@ class TestAnonymousUserPermissions(TestCase):
response = self.client.post('/job-offers/', data=json.dumps(post), content_type='application/ld+json')
self.assertEqual(response.status_code, 403)
# TODO: test POST request for anonymous user where it's allowed
def test_put_request_for_anonymousUser(self):
body = {'title':"job_updated"}
response = self.client.put('/job-offers/{}/'.format(self.job.pk), data=json.dumps(body),
......
import json
from django.contrib.auth import get_user_model
from rest_framework.test import APIRequestFactory, APIClient, APITestCase
from rest_framework.test import APIClient, APIRequestFactory, APITestCase
from djangoldp.tests.models import UserProfile
class TestAutoAuthor(APITestCase):
......@@ -10,14 +12,15 @@ class TestAutoAuthor(APITestCase):
self.factory = APIRequestFactory()
self.client = APIClient()
self.user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=self.user)
def tearDown(self):
self.user.delete()
def test_save_with_anonymous_user(self):
post = {
'@graph': [{'http://happy-dev.fr/owl/#content': "post content"}]}
'@graph': [{'https://cdn.startinblox.com/owl#content': "post content"}]}
response = self.client.post('/posts/', data=json.dumps(post), content_type='application/ld+json')
self.assertEqual(response.status_code, 201)
self.assertEquals(response.data['content'], "post content")
self.assertEqual(response.data['content'], "post content")
\ No newline at end of file
import copy
import time
import uuid
from django.contrib.auth import get_user_model
from django.test import override_settings
from rest_framework.test import APIClient, APITestCase
from djangoldp.activities.services import (BACKLINKS_ACTOR, ActivityPubService,
ActivityQueueService)
from djangoldp.models import Activity, ScheduledActivity
from djangoldp.tests.models import Circle, Project
class TestsBacklinksService(APITestCase):
def setUp(self):
self.client = APIClient(enforce_csrf_checks=True)
self.local_user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com',
password='glass onion')
def _get_random_external_user(self):
'''Auxiliary function creates a user with random external urlid and returns it'''
username = str(uuid.uuid4())
email = username + '@test.com'
urlid = 'https://distant.com/users/' + username
return get_user_model().objects.create_user(username=username, email=email, password='test', urlid=urlid)
# TODO: inbox discovery (https://git.startinblox.com/djangoldp-packages/djangoldp/issues/233)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_local_object_with_distant_foreign_key(self):
# a local Circle with a distant owner
local_circle = Circle.objects.create(description='Test')
external_user = self._get_random_external_user()
local_circle.owner = external_user
local_circle.save()
# assert that a activity was sent
self.assertEqual(Activity.objects.all().count(), 1)
# reset to a local user, another (update) activity should be sent
local_circle.owner = self.local_user
local_circle.save()
self.assertEqual(Activity.objects.all().count(), 2)
# external user should no longer be following the object. A further update should not send an activity
# TODO: https://git.startinblox.com/djangoldp-packages/djangoldp/issues/257
'''another_user = get_user_model().objects.create_user(username='test', email='test@test.com',
password='glass onion')
local_circle.owner = another_user
local_circle.save()
self.assertEqual(Activity.objects.all().count(), 2)'''
# re-add the external user as owner
local_circle.owner = external_user
local_circle.save()
# delete parent
local_circle.delete()
self.assertEqual(Activity.objects.all().count(), 4)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_local_object_with_external_m2m_join_leave(self):
# a local project with three distant users
project = Project.objects.create(description='Test')
external_a = self._get_random_external_user()
external_b = self._get_random_external_user()
external_c = self._get_random_external_user()
project.members.add(external_a)
project.members.add(external_b)
project.members.add(external_c)
self.assertEqual(Activity.objects.all().count(), 3)
# remove one individual
project.members.remove(external_a)
self.assertEqual(Activity.objects.all().count(), 4)
# clear the rest
project.members.clear()
self.assertEqual(Activity.objects.all().count(), 6)
prior_count = Activity.objects.all().count()
# once removed I should not be following the object anymore
project.delete()
self.assertEqual(Activity.objects.all().count(), prior_count)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_local_object_with_external_m2m_delete_parent(self):
project = Project.objects.create(description='Test')
external_a = self._get_random_external_user()
project.members.add(external_a)
prior_count = Activity.objects.all().count()
project.delete()
self.assertEqual(Activity.objects.all().count(), prior_count + 1)
# test that older ScheduledActivity is discarded for newer ScheduledActivity
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_old_invalid_scheduled_activity_discarded(self):
def send_two_activities_and_assert_old_discarded(obj):
# there are two scheduled activities with the same object, (and different time stamps)
old_activity = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Create', summary='old')
old_scheduled = ActivityQueueService._save_sent_activity(old_activity, ScheduledActivity)
new_activity = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Update', summary='new')
new_scheduled = ActivityQueueService._save_sent_activity(new_activity, ScheduledActivity)
# both are sent to the ActivityQueueService
ActivityQueueService._activity_queue_worker('http://127.0.0.1:8001/idontexist/', old_scheduled)
time.sleep(0.1)
ActivityQueueService._activity_queue_worker('http://127.0.0.1:8001/idontexist/', new_scheduled)
time.sleep(0.1)
# assert that all scheduled activities were cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
# assert that ONLY the newly scheduled activity was sent
activities = Activity.objects.all()
self.assertEqual(Activity.objects.count(), 1)
astream = activities[0].to_activitystream()
self.assertEqual(astream['summary'], new_activity['summary'])
activities[0].delete()
# variation using expanded syntax
obj = {
'@id': 'https://test.com/users/test/'
}
send_two_activities_and_assert_old_discarded(obj)
# variation using id-only syntax
obj = 'https://test.com/users/test/'
send_two_activities_and_assert_old_discarded(obj)
# test that older ScheduledActivity is still sent if it's on a different object
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_old_valid_scheduled_activity_sent(self):
# there are two scheduled activities with different objects
obj = 'https://test.com/users/test1/'
activity_a = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Create', summary='A')
scheduled_a = ActivityQueueService._save_sent_activity(activity_a, ScheduledActivity)
obj = 'https://test.com/users/test2/'
activity_b = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Create', summary='B')
scheduled_b = ActivityQueueService._save_sent_activity(activity_b, ScheduledActivity)
# both are sent to the same inbox
ActivityQueueService._activity_queue_worker('http://127.0.0.1:8001/idontexist/', scheduled_a)
ActivityQueueService._activity_queue_worker('http://127.0.0.1:8001/idontexist/', scheduled_b)
# assert that both scheduled activities were sent, and the scheduled activities were cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 2)
# variation on the previous test where the two activities are working on different models (using the same object)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_old_valid_scheduled_activity_sent_same_object(self):
obj = 'https://test.com/users/test1/'
target = {'@type': 'hd:skill', '@id': 'https://api.test1.startinblox.com/skills/4/'}
activity_a = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Add', summary='A', target=target)
scheduled_a = ActivityQueueService._save_sent_activity(activity_a, ScheduledActivity)
obj = 'https://test.com/users/test1/'
target = {'@type': 'hd:joboffer', '@id': 'https://api.test1.startinblox.com/job-offers/1/'}
activity_b = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Add', summary='B', target=target)
scheduled_b = ActivityQueueService._save_sent_activity(activity_b, ScheduledActivity)
# both are sent to the same inbox
ActivityQueueService._activity_queue_worker('http://127.0.0.1:8001/idontexist/', scheduled_a)
ActivityQueueService._activity_queue_worker('http://127.0.0.1:8001/idontexist/', scheduled_b)
# assert that both scheduled activities were sent, and the scheduled activities were cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 2)
# variation using an Add and a Remove (one defines target, the other origin)
# also tests that an unnecessary add is not sent
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_matching_origin_and_target_not_sent(self):
a = {'type': 'Add', 'actor': {'type': 'Service', 'name': 'Backlinks Service'},
'object': {'@type': 'foaf:user', '@id': 'https://api.test2.startinblox.com/users/calum/'},
'target': {'@type': 'hd:skill', '@id': 'https://api.test1.startinblox.com/skills/3/'}}
scheduled_a = ActivityQueueService._save_sent_activity(a, ScheduledActivity)
b = {'type': 'Remove', 'actor': {'type': 'Service', 'name': 'Backlinks Service'},
'object': {'@type': 'foaf:user', '@id': 'https://api.test2.startinblox.com/users/calum/'},
'origin': {'@type': 'hd:skill', '@id': 'https://api.test1.startinblox.com/skills/3/'}}
scheduled_b = ActivityQueueService._save_sent_activity(b, ScheduledActivity)
# both are sent to the same inbox
ActivityQueueService._activity_queue_worker('http://127.0.0.1:8001/idontexist/', scheduled_a)
ActivityQueueService._activity_queue_worker('http://127.0.0.1:8001/idontexist/', scheduled_b)
# assert that both scheduled activities were sent, and the scheduled activities were cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 1)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_unnecessary_add_not_sent(self):
# an add activity was sent previously
a = {'type': 'Add', 'actor': {'type': 'Service', 'name': 'Backlinks Service'},
'object': {'@type': 'foaf:user', '@id': 'https://api.test2.startinblox.com/users/calum/'},
'target': {'@type': 'hd:skill', '@id': 'https://api.test1.startinblox.com/skills/3/'}}
ActivityQueueService._save_activity_from_response({'status_code': '201'}, 'https://distant.com/inbox/', a)
# no remove has since been sent, but a new Add is scheduled
scheduled_b = ActivityQueueService._save_sent_activity(a, ScheduledActivity, success=False, type='add',
external_id='https://distant.com/inbox/')
ActivityQueueService._activity_queue_worker('https://distant.com/inbox/', scheduled_b)
# assert that only the previous activity was sent, and the scheduled activites cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 1)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_unnecessary_remove_not_sent(self):
# an remove activity was sent previously
a = {'type': 'Remove', 'actor': {'type': 'Service', 'name': 'Backlinks Service'},
'object': {'@type': 'foaf:user', '@id': 'https://api.test2.startinblox.com/users/calum/'},
'target': {'@type': 'hd:skill', '@id': 'https://api.test1.startinblox.com/skills/3/'}}
ActivityQueueService._save_activity_from_response({'status_code': '201'}, 'https://distant.com/inbox/', a)
# no add has since been sent, but a new Remove is scheduled
scheduled_b = ActivityQueueService._save_sent_activity(a, ScheduledActivity, success=False, type='remove',
external_id='https://distant.com/inbox/')
ActivityQueueService._activity_queue_worker('https://distant.com/inbox/', scheduled_b)
# assert that only the previous activity was sent, and the scheduled activites cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 1)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_necessary_add_sent(self):
# a remove activity was sent previously
a = {'type': 'Remove', 'actor': {'type': 'Service', 'name': 'Backlinks Service'},
'object': {'@type': 'foaf:user', '@id': 'https://api.test2.startinblox.com/users/calum/'},
'target': {'@type': 'hd:skill', '@id': 'https://api.test1.startinblox.com/skills/3/'}}
ActivityQueueService._save_activity_from_response({'status_code': '201'}, 'https://distant.com/inbox/', a)
# an add is now being sent
scheduled_b = ActivityQueueService._save_sent_activity(a, ScheduledActivity, type='add',
external_id='https://distant.com/inbox/')
ActivityQueueService._activity_queue_worker('https://distant.com/inbox/', scheduled_b)
# assert that both activities sent, and the scheduled activites cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 2)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_first_add_sent(self):
# no activity has been sent with this target, before this add
a = {'type': 'Add', 'actor': {'type': 'Service', 'name': 'Backlinks Service'},
'object': {'@type': 'foaf:user', '@id': 'https://api.test2.startinblox.com/users/calum/'},
'target': {'@type': 'hd:skill', '@id': 'https://api.test1.startinblox.com/skills/3/'}}
scheduled = ActivityQueueService._save_sent_activity(a, ScheduledActivity, success=True, type='add',
external_id='https://distant.com/inbox/')
ActivityQueueService._activity_queue_worker('https://distant.com/inbox/', scheduled)
# assert that the activity was sent, and the scheduled activites cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 1)
# validate Update activity objects have new info before sending the notification
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_unnecessary_update_not_sent(self):
# an object was sent in one activity
obj = {
'@type': 'hd:circle',
'@id': 'https://test.com/circles/8/',
'owner': {'@id': 'https://distant.com/users/john/',
'@type': 'foaf:user'}
}
activity_a = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Create', summary='A')
ActivityQueueService._save_activity_from_response({'status_code': '201'}, 'https://distant.com/inbox/', activity_a)
# now I'm sending an update, which doesn't change anything about the object
activity_b = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Create', summary='B')
scheduled_b = ActivityQueueService._save_sent_activity(activity_b, ScheduledActivity, type='update',
external_id='https://distant.com/inbox/')
ActivityQueueService._activity_queue_worker('https://distant.com/inbox/', scheduled_b)
# assert that only the previous activity was sent, and the scheduled activites cleaned up
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 1)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_necessary_update_is_sent(self):
# an object was sent in one activity
obj = {
'@type': 'hd:circle',
'@id': 'https://test.com/circles/8/',
'owner': {'@id': 'https://distant.com/users/john/',
'@type': 'foaf:user'}
}
activity_a = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Create', summary='A')
ActivityQueueService._save_activity_from_response({'status_code': '201'}, 'https://distant.com/inbox/', activity_a)
# now I'm sending an update, which changes the owner of the circle
obj['owner']['@id'] = 'https://distant.com/users/mark/'
activity_b = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Create', summary='B')
scheduled_b = ActivityQueueService._save_sent_activity(activity_b, ScheduledActivity, type='update',
external_id='https://distant.com/inbox/')
ActivityQueueService._activity_queue_worker('https://distant.com/inbox/', scheduled_b)
# assert that both activities were sent
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 2)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_first_update_is_sent(self):
# no prior activity was sent for this object - should send
obj = {
'@type': 'hd:circle',
'@id': 'https://test.com/circles/8/',
'owner': {'@id': 'https://distant.com/users/john/',
'@type': 'foaf:user'}
}
activity = ActivityPubService.build_activity(BACKLINKS_ACTOR, obj, activity_type='Create', summary='A')
scheduled = ActivityQueueService._save_sent_activity(activity, ScheduledActivity, type='update',
external_id='https://distant.com/inbox/')
ActivityQueueService._activity_queue_worker('https://distant.com/inbox/', scheduled)
self.assertEqual(ScheduledActivity.objects.count(), 0)
self.assertEqual(Activity.objects.count(), 1)
from django.contrib.auth import get_user_model
from django.test import TestCase, override_settings
from rest_framework.test import APIClient, APIRequestFactory
from rest_framework.utils import json
from djangoldp.tests.models import Circle, Conversation, Project
class TestCache(TestCase):
def setUp(self):
self.factory = APIRequestFactory()
self.client = APIClient()
self.user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com',
password='glass onion', first_name='John')
self.client.force_authenticate(self.user)
def tearDown(self):
setattr(Circle._meta, 'depth', 0)
setattr(Circle._meta, 'empty_containers', [])
# test container cache after new resource added
@override_settings(SERIALIZER_CACHE=True)
def test_save_fk_graph_with_nested(self):
response = self.client.get('/batchs/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
post = {
'@graph': [
{
'https://cdn.startinblox.com/owl#title': "title",
'https://cdn.startinblox.com/owl#invoice': {
'@id': "_.123"
}
},
{
'@id': "_.123",
'https://cdn.startinblox.com/owl#title': "title 2"
}
]
}
response = self.client.post('/batchs/', data=json.dumps(post), content_type='application/ld+json')
self.assertEqual(response.status_code, 201)
response = self.client.get('/batchs/', content_type='application/ld+json')
self.assertIn('ldp:contains', response.data)
self.assertEqual(response.data['ldp:contains'][0]['title'], "title")
self.assertEqual(response.data['ldp:contains'][0]['invoice']['title'], "title 2")
# test resource cache after it is updated
@override_settings(SERIALIZER_CACHE=True)
def test_update_with_new_fk_relation(self):
conversation = Conversation.objects.create(author_user=self.user, description="conversation description")
response = self.client.get('/conversations/{}/'.format(conversation.pk), content_type='application/ld+json')
body = [
{
'@id': "/conversations/{}/".format(conversation.pk),
'https://cdn.startinblox.com/owl#description': "conversation update",
'https://cdn.startinblox.com/owl#peer_user': {
'@id': self.user.urlid,
}
}
]
response = self.client.put('/conversations/{}/'.format(conversation.pk), data=json.dumps(body),
content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
response = self.client.get('/conversations/{}/'.format(conversation.pk), content_type='application/ld+json')
self.assertIn('peer_user', response.data)
self.assertEqual('conversation update', response.data['description'])
self.assertEqual(response.data['peer_user']['@id'], self.user.urlid)
self.assertIn('@type', response.data['peer_user'])
# test resource cache after it is updated - external resource
@override_settings(SERIALIZER_CACHE=True)
def test_update_with_new_fk_relation_external(self):
conversation = Conversation.objects.create(author_user=self.user, description="conversation description")
response = self.client.get('/conversations/{}/'.format(conversation.pk), content_type='application/ld+json')
external_user = get_user_model().objects.create_user(username='external', email='jlennon@beatles.com',
password='glass onion', urlid='https://external.com/users/external/')
body = [
{
'@id': "/conversations/{}/".format(conversation.pk),
'https://cdn.startinblox.com/owl#description': "conversation update",
'https://cdn.startinblox.com/owl#peer_user': {
'@id': external_user.urlid,
}
}
]
response = self.client.put('/conversations/{}/'.format(conversation.pk), data=json.dumps(body),
content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
response = self.client.get('/conversations/{}/'.format(conversation.pk), content_type='application/ld+json')
self.assertIn('peer_user', response.data)
self.assertEqual('conversation update', response.data['description'])
self.assertIn('@id', response.data['peer_user'])
# serialize external id and only external id
self.assertEqual(response.data['peer_user']['@id'], external_user.urlid)
self.assertIn('@type', response.data['peer_user'])
self.assertEqual(len(response.data['peer_user']), 2)
# test container cache after member is deleted by view
@override_settings(SERIALIZER_CACHE=True)
def test_cached_container_deleted_resource_view(self):
conversation = Conversation.objects.create(author_user=self.user, description="conversation description")
response = self.client.get('/conversations/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 1)
response = self.client.delete('/conversations/{}/'.format(conversation.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 204)
response = self.client.get('/conversations/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 0)
# test container cache after member is deleted manually
@override_settings(SERIALIZER_CACHE=True)
def test_cached_container_deleted_resource_manual(self):
conversation = Conversation.objects.create(author_user=self.user, description="conversation description")
response = self.client.get('/conversations/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 1)
conversation.delete()
response = self.client.get('/conversations/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 0)
# test resource cache after it is deleted manually
@override_settings(SERIALIZER_CACHE=True)
def test_cached_resource_deleted_resource_manual(self):
conversation = Conversation.objects.create(author_user=self.user, description="conversation description")
response = self.client.get('/conversations/{}/'.format(conversation.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
conversation.delete()
response = self.client.get('/conversations/{}/'.format(conversation.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 404)
# test container cache following m2m_changed - Project (which inherits from djangoldp.models.Model)
@override_settings(SERIALIZER_CACHE=True)
def test_cached_container_m2m_changed_project(self):
project = Project.objects.create(description='Test')
response = self.client.get('/projects/{}/members/'.format(project.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 0)
project.members.add(self.user)
response = self.client.get('/projects/{}/members/'.format(project.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 1)
project.members.remove(self.user)
response = self.client.get('/projects/{}/members/'.format(project.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 0)
project.members.add(self.user)
project.members.clear()
response = self.client.get('/projects/{}/members/'.format(project.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 0)
# test container cache following m2m_changed - Conversation (which does not inherit from djangoldp.models.Model)
@override_settings(SERIALIZER_CACHE=True)
def test_cached_container_m2m_changed_conversation(self):
conversation = Conversation.objects.create(author_user=self.user, description="conversation description")
response = self.client.get('/conversations/{}/observers/'.format(conversation.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 0)
conversation.observers.add(self.user)
response = self.client.get('/conversations/{}/observers/'.format(conversation.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 1)
conversation.observers.remove(self.user)
response = self.client.get('/conversations/{}/observers/'.format(conversation.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 0)
conversation.observers.add(self.user)
conversation.observers.clear()
response = self.client.get('/conversations/{}/observers/'.format(conversation.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 0)
# test cache working inside of the nested field (serializer) of another object
@override_settings(SERIALIZER_CACHE=True)
def test_cached_container_serializer_nested_field(self):
project = Project.objects.create(description='Test')
response = self.client.get('/projects/{}/'.format(project.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['members']['ldp:contains']), 0)
project.members.add(self.user)
response = self.client.get('/projects/{}/'.format(project.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['members']['ldp:contains']), 1)
project.members.remove(self.user)
response = self.client.get('/projects/{}/'.format(project.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['members']['ldp:contains']), 0)
project.members.add(self.user)
project.members.clear()
response = self.client.get('/projects/{}/'.format(project.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['members']['ldp:contains']), 0)
# test cache working on a serialized nested field at higher depth
@override_settings(SERIALIZER_CACHE=True)
def test_cache_depth_2(self):
setattr(Circle._meta, 'depth', 2)
circle = Circle.objects.create(description='Test')
response = self.client.get('/circles/{}/'.format(circle.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['members']['user_set']), 0)
circle.members.user_set.add(self.user)
response = self.client.get('/circles/{}/'.format(circle.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['members']['user_set']), 1)
# assert the depth is applied
self.assertIn('first_name', response.data['members']['user_set'][0])
self.assertEqual(response.data['members']['user_set'][0]['first_name'], self.user.first_name)
# make a change to the _user_
self.user.first_name = "Alan"
self.user.save()
# assert that the use under the circles members has been updated
response = self.client.get('/circles/{}/'.format(circle.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['members']['user_set']), 1)
self.assertIn('first_name', response.data['members']['user_set'][0])
self.assertEqual(response.data['members']['user_set'][0]['first_name'], self.user.first_name)
# test the cache behaviour when empty_containers is an active setting
@override_settings(SERIALIZER_CACHE=True)
def test_cache_empty_container(self):
setattr(Circle._meta, 'depth', 1)
setattr(Circle._meta, 'empty_containers', ['members'])
circle = Circle.objects.create(name='test', description='test', owner=self.user)
circle.members.user_set.add(self.user)
# make one call on the parent
response = self.client.get('/circles/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertIn('ldp:contains', response.data)
self.assertEqual(len(response.data['ldp:contains']), 1)
self.assertIn('members', response.data['ldp:contains'][0])
self.assertIn('@id', response.data['ldp:contains'][0]['members'])
self.assertIn('user_set', response.data['ldp:contains'][0]['members'])
self.assertEqual(len(response.data['ldp:contains'][0]['members']['user_set']), 1)
self.assertIn('@id', response.data['ldp:contains'][0]['members']['user_set'][0])
self.assertEqual(response.data['ldp:contains'][0]['members']['user_set'][0]['@type'], 'foaf:user')
# and a second on the child
response = self.client.get(response.data['ldp:contains'][0]['members']['@id'], content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertIn('@id', response.data)
self.assertEqual(len(response.data['user_set']), 1)
from rest_framework.test import APIRequestFactory, APIClient, APITestCase
from datetime import datetime
from rest_framework.test import APIRequestFactory, APIClient, APITestCase
from django.contrib.auth import get_user_model
from rest_framework.test import APIClient, APIRequestFactory, APITestCase
from djangoldp.tests.models import Post, Invoice, JobOffer, Skill, Batch
from djangoldp.serializers import GLOBAL_SERIALIZER_CACHE
from djangoldp.tests.models import (Batch, Circle, Conversation, DateModel,
Invoice, JobOffer, Message, Post, Skill,
User, UserProfile)
class TestGET(APITestCase):
......@@ -10,16 +14,37 @@ class TestGET(APITestCase):
def setUp(self):
self.factory = APIRequestFactory()
self.client = APIClient()
self.ordered_fields = ['@context', '@type', '@id']
setattr(Circle._meta, 'depth', 0)
setattr(Circle._meta, 'empty_containers', [])
def tearDown(self):
pass
GLOBAL_SERIALIZER_CACHE.reset()
def test_get_resource(self):
post = Post.objects.create(content="content")
response = self.client.get('/posts/{}/'.format(post.pk), content_type='application/ld+json')
response = self.client.get('/posts/{}/'.format(post.pk), content_type='application/ld+json', HTTP_ORIGIN='http://localhost:8080/test/')
self.assertEqual(response.status_code, 200)
self.assertEquals(response.data['content'], "content")
self.assertEqual(response.data['content'], "content")
self.assertIn('author', response.data)
self.assertIn('@type', response.data)
# test headers returned
self.assertEqual(response['Content-Type'], 'application/ld+json')
self.assertEqual(response['Accept-Post'], 'application/ld+json')
self.assertEqual(response['Allow'], 'GET, PUT, PATCH, DELETE, HEAD, OPTIONS')
self.assertEqual(response['Access-Control-Allow-Origin'], 'http://localhost:8080/test/')
self.assertIn('DPoP', response['Access-Control-Allow-Headers'])
def test_get_resource_urlid(self):
user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com',
password='glass onion')
UserProfile.objects.create(user=user)
post = Post.objects.create(content="content", author=user)
response = self.client.get('/posts/{}/'.format(post.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['content'], "content")
self.assertEqual(response.data['author']['@id'], user.urlid)
def test_get_container(self):
Post.objects.create(content="content")
......@@ -27,26 +52,26 @@ class TestGET(APITestCase):
Post.objects.create(content="federated", urlid="https://external.com/posts/1/")
response = self.client.get('/posts/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertIn('permissions', response.data)
self.assertEquals(1, len(response.data['ldp:contains']))
self.assertEquals(2, len(response.data['permissions'])) # read and add
self.assertEqual(1, len(response.data['ldp:contains']))
self.assertIn('@type', response.data)
self.assertIn('@type', response.data['ldp:contains'][0])
self.assertNotIn('permissions', response.data['ldp:contains'][0])
Invoice.objects.create(title="content")
response = self.client.get('/invoices/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertIn('permissions', response.data)
self.assertEquals(1, len(response.data['permissions'])) # read only
self.assertEqual(1, len(response.data['permissions'])) # read only
def test_get_empty_container(self):
Post.objects.all().delete()
response = self.client.get('/posts/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEquals(0, len(response.data['ldp:contains']))
self.assertEqual(0, len(response.data['ldp:contains']))
def test_get_filtered_fields(self):
skill = Skill.objects.create(title="Java", obligatoire="ok", slug="1")
skill2 = Skill.objects.create(title="Java", obligatoire="ok", slug="2")
skill3 = Skill.objects.create(urlid="http://external/skills/1")
skill3 = Skill.objects.create(urlid="http://happy-dev.hubl.fr/skills/1")
job = JobOffer.objects.create(title="job", slug="1")
job.skills.add(skill)
job.skills.add(skill2)
......@@ -56,7 +81,11 @@ class TestGET(APITestCase):
self.assertEqual(response.status_code, 200)
self.assertIn('recent_skills', response.data)
self.assertEqual(response.data['recent_skills']['@id'], "http://happy-dev.fr/job-offers/1/recent_skills/")
self.assertEqual(response.data['skills']['ldp:contains'][2]['@id'], "http://external/skills/1")
# the external resource should be serialized with its @id and @type.. and only these fields
self.assertEqual(response.data['skills']['ldp:contains'][2]['@id'], "http://happy-dev.hubl.fr/skills/1")
self.assertIn('@type', response.data['skills']['ldp:contains'][1])
self.assertIn('@type', response.data['skills']['ldp:contains'][2])
self.assertEqual(len(response.data['skills']['ldp:contains'][2].items()), 2)
def test_get_reverse_filtered_fields(self):
skill = Skill.objects.create(title="Java", obligatoire="ok", slug="1")
......@@ -78,7 +107,10 @@ class TestGET(APITestCase):
response = self.client.get('/job-offers/{}/'.format(job.slug), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertIn('some_skill', response.data)
self.assertEqual(response.data['some_skill']['@id'], "http://testserver/skills/1/")
self.assertEqual(response.data['some_skill']['@id'], skill.urlid)
response = self.client.get('/job-offers/{}/recent_skills/'.format(job.slug), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 2)
def test_get_nested(self):
invoice = Invoice.objects.create(title="invoice")
......@@ -86,5 +118,122 @@ class TestGET(APITestCase):
distant_batch = Batch.objects.create(invoice=invoice, title="distant", urlid="https://external.com/batch/1/")
response = self.client.get('/invoices/{}/batches/'.format(invoice.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEquals(response.data['@id'], 'http://happy-dev.fr/invoices/{}/batches/'.format(invoice.pk))
self.assertEquals(len(response.data['ldp:contains']), 2)
self.assertEqual(response.data['@id'], 'http://happy-dev.fr/invoices/{}/batches/'.format(invoice.pk))
self.assertIn('permissions', response.data)
self.assertEqual(len(response.data['ldp:contains']), 2)
self.assertIn('@type', response.data['ldp:contains'][0])
self.assertIn('@type', response.data['ldp:contains'][1])
self.assertNotIn('permissions', response.data['ldp:contains'][0])
self.assertNotIn('permissions', response.data['ldp:contains'][1])
self.assertEqual(response.data['ldp:contains'][0]['invoice']['@id'], invoice.urlid)
self.assertEqual(response.data['ldp:contains'][1]['@id'], distant_batch.urlid)
def test_get_nested_without_related_name(self):
user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com', password='glass onion')
conversation = Conversation.objects.create(author_user=user)
message = Message.objects.create(conversation=conversation, author_user=user)
response = self.client.get('/conversations/{}/message_set/'.format(conversation.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['@id'], 'http://happy-dev.fr/conversations/{}/message_set/'.format(conversation.pk))
self.assertEqual(len(response.data['ldp:contains']), 1)
# TODO: https://git.startinblox.com/djangoldp-packages/djangoldp/issues/335
# test getting a route with multiple nested fields (/job-offers/X/skills/Y/)
'''def test_get_twice_nested(self):
job = JobOffer.objects.create(title="job", slug="slug1")
skill = Skill.objects.create(title='old', obligatoire='old', slug='skill1')
job.skills.add(skill)
self.assertEqual(job.skills.count(), 1)
response = self.client.get('/job-offers/{}/skills/{}/'.format(job.slug, skill.slug))
self.assertEqual(response.status_code, 200)'''
def test_serializer_excludes(self):
date = DateModel.objects.create(excluded='test', value=datetime.now())
response = self.client.get('/datemodels/{}/'.format(date.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertNotIn('excluded', response.data.keys())
def test_serializer_excludes_serializer_fields_set_also(self):
setattr(DateModel._meta, 'serializer_fields', ['value', 'excluded'])
date = DateModel.objects.create(excluded='test', value=datetime.now())
response = self.client.get('/datemodels/{}/'.format(date.pk), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertNotIn('excluded', response.data.keys())
def _set_up_circle_and_user(self):
user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com',
password='glass onion')
circle = Circle.objects.create(name='test', description='test', owner=user)
self.client.force_authenticate(user)
circle.members.user_set.add(user)
return user
# tests for functionality allowing me to set containers to be serialized without content\
# test for normal functioning (without setting)
def test_empty_container_serialization_nested_serializer_no_empty(self):
setattr(Circle._meta, 'depth', 1)
self._set_up_circle_and_user()
response = self.client.get('/circles/', content_type='application/ld+json')
self.assertEqual(response.data['@type'], 'ldp:Container')
self.assertIn('@id', response.data)
self.assertIn('permissions', response.data)
self.assertIn('members', response.data['ldp:contains'][0])
self.assertEqual(response.data['ldp:contains'][0]['members']['@type'], 'foaf:Group')
self.assertIn('@id', response.data['ldp:contains'][0]['members'])
self.assertEqual(len(response.data['ldp:contains'][0]['members']['user_set']), 1)
# test for functioning with setting
def test_empty_container_serialization_nested_serializer_empty(self):
setattr(User._meta, 'depth', 1)
setattr(User._meta, 'empty_containers', ['owned_circles'])
self._set_up_circle_and_user()
response = self.client.get('/users/', content_type='application/ld+json')
self.assertEqual(response.data['@type'], 'ldp:Container')
self.assertIn('owned_circles', response.data['ldp:contains'][0])
self.assertIn('@id', response.data['ldp:contains'][0]['owned_circles'])
self.assertNotIn('permissions', response.data['ldp:contains'][0]['owned_circles'])
self.assertNotIn('ldp:contains', response.data['ldp:contains'][0]['owned_circles'])
# should serialize as normal on the nested viewset (directly asking for the container)
# test for normal functioning (without setting)
def test_empty_container_serialization_nested_viewset_no_empty(self):
user = self._set_up_circle_and_user()
response = self.client.get(f'/users/{user.pk}/owned_circles/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['@type'], 'ldp:Container')
self.assertIn('@id', response.data)
self.assertIn('ldp:contains', response.data)
self.assertIn('permissions', response.data)
self.assertIn('owner', response.data['ldp:contains'][0])
# test for functioning with setting
def test_empty_container_serialization_nested_viewset_empty(self):
setattr(User._meta, 'empty_containers', ['owned_circles'])
user = self._set_up_circle_and_user()
response = self.client.get(f'/users/{user.pk}/owned_circles/', content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['@type'], 'ldp:Container')
self.assertIn('@id', response.data)
self.assertIn('ldp:contains', response.data)
self.assertIn('permissions', response.data)
self.assertIn('owner', response.data['ldp:contains'][0])
# # test for checking fields ordering
# def test_ordered_field(self):
# self._set_up_circle_and_user()
# response = self.client.get('/users/', content_type='application/ld+json')
# fields_to_test = [
# response.data.keys(),
# response.data['ldp:contains'][-1],
# response.data['ldp:contains'][-1]['circle_set']
# ]
# for test_fields in fields_to_test:
# test_fields = list(test_fields)
# o_f = [field for field in self.ordered_fields if field in test_fields]
# self.assertEqual(o_f, test_fields[:len(o_f)])
import json
import uuid
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from rest_framework.test import APIClient, APITestCase
from guardian.shortcuts import assign_perm
from .models import PermissionlessDummy, Dummy
from djangoldp.permissions import LDPPermissions
from .models import PermissionlessDummy, Dummy, LDPDummy
class TestsGuardian(APITestCase):
......@@ -15,35 +16,93 @@ class TestsGuardian(APITestCase):
def setUpLoggedInUser(self):
self.user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com',
password='glass onion')
self.group = Group.objects.create(name='Test')
self.user.groups.add(self.group)
self.user.save()
self.client.force_authenticate(user=self.user)
# optional setup for testing PermissionlessDummy model with parameterised perms
def setUpGuardianDummyWithPerms(self, perms=[]):
self.dummy = PermissionlessDummy.objects.create(some='test', slug='test')
def _get_dummy_with_perms(self, perms=None, parent=None, group=False):
if perms is None:
perms = []
dummy = PermissionlessDummy.objects.create(some='test', slug=uuid.uuid4(), parent=parent)
model_name = PermissionlessDummy._meta.model_name
for perm in perms:
assign_perm(perm + '_' + model_name, self.user, self.dummy)
perm = perm + '_' + model_name
if group:
#assigns container-level and object-level perms
assign_perm('tests.'+perm, self.group)
assign_perm(perm, self.group, dummy)
else:
assign_perm('tests.'+perm, self.user)
assign_perm(perm, self.user, dummy)
return dummy
# optional setup for testing PermissionlessDummy model with parameterised perms
def setUpGuardianDummyWithPerms(self, perms=None, parent=None, group=False):
self.dummy = self._get_dummy_with_perms(perms, parent, group)
# auxiliary function converts permission format for test
def _unpack_permissions(self, perms_from_response):
return perms_from_response
# test that dummy with no permissions set returns no results
def test_get_dummy_no_permissions(self):
self.setUpLoggedInUser()
self.setUpGuardianDummyWithPerms()
response = self.client.get('/permissionless-dummys/{}/'.format(self.dummy.slug))
self.assertEqual(response.status_code, 403)
self.assertEqual(response.status_code, 404)
# test with anonymous user
def test_get_dummy_anonymous_user(self):
self.setUpGuardianDummyWithPerms()
response = self.client.get('/permissionless-dummys/')
# I have no object permissions - I should receive a 403
self.assertEqual(response.status_code, 403)
# tests that dummy with permissions set enforces these permissions
def test_list_dummy_permission_granted(self):
def test_list_dummy_exception(self):
self.setUpLoggedInUser()
self.setUpGuardianDummyWithPerms(['view'])
# I have permission on a permissionless dummy, but not in general
dummy_a = self._get_dummy_with_perms()
dummy_b = self._get_dummy_with_perms(['view'])
response = self.client.get('/permissionless-dummys/')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 1)
containees = [d['@id'] for d in response.data['ldp:contains']]
self.assertNotIn(dummy_a.urlid, containees)
self.assertIn(dummy_b.urlid, containees)
def test_list_dummy_group_exception(self):
self.setUpLoggedInUser()
dummy_a = self._get_dummy_with_perms()
dummy_b = self._get_dummy_with_perms(['view'], group=True)
response = self.client.get('/permissionless-dummys/')
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 1)
containees = [d['@id'] for d in response.data['ldp:contains']]
self.assertNotIn(dummy_a.urlid, containees)
self.assertIn(dummy_b.urlid, containees)
def test_list_dummy_exception_nested_view(self):
self.setUpLoggedInUser()
parent = LDPDummy.objects.create(some="test")
# two dummies, one I have permission to view and one I don't
dummy_a = self._get_dummy_with_perms(parent=parent)
dummy_b = self._get_dummy_with_perms(['view'], parent)
response = self.client.get('/ldpdummys/{}/anons/'.format(parent.pk))
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['ldp:contains']), 1)
def test_list_dummy_exception_nested_serializer(self):
self.setUpLoggedInUser()
parent = LDPDummy.objects.create(some="test")
# two dummies, one I have permission to view and one I don't
dummy_a = self._get_dummy_with_perms(parent=parent)
dummy_b = self._get_dummy_with_perms(['view'], parent)
response = self.client.get('/ldpdummys/{}/'.format(parent.pk))
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['anons']['ldp:contains']), 1)
def test_get_dummy_permission_granted(self):
self.setUpLoggedInUser()
......@@ -51,23 +110,22 @@ class TestsGuardian(APITestCase):
response = self.client.get('/permissionless-dummys/{}/'.format(self.dummy.slug))
self.assertEqual(response.status_code, 200)
def test_get_dummy_group_permission_granted(self):
self.setUpLoggedInUser()
self.setUpGuardianDummyWithPerms(['view'], group=True)
response = self.client.get('/permissionless-dummys/{}/'.format(self.dummy.slug))
self.assertEqual(response.status_code, 200)
def test_get_dummy_permission_rejected(self):
self.setUpLoggedInUser()
self.setUpGuardianDummyWithPerms(['view'])
dummy_without = PermissionlessDummy.objects.create(some='test2', slug='test2')
response = self.client.get('/permissionless-dummys/{}/'.format(dummy_without.slug))
self.assertEqual(response.status_code, 403)
def test_post_dummy_permission_granted(self):
self.setUpLoggedInUser()
self.setUpGuardianDummyWithPerms(['add'])
post = {'some': "some_new", "slug": 'slug1'}
response = self.client.post('/permissionless-dummys/', data=json.dumps(post), content_type='application/ld+json')
self.assertEqual(response.status_code, 201)
self.assertEqual(response.status_code, 404)
def test_patch_dummy_permission_granted(self):
self.setUpLoggedInUser()
self.setUpGuardianDummyWithPerms(['change'])
self.setUpGuardianDummyWithPerms(['view', 'change'])
body = {'some': "some_new"}
response = self.client.patch('/permissionless-dummys/{}/'.format(self.dummy.slug), data=json.dumps(body),
content_type='application/ld+json')
......@@ -80,16 +138,17 @@ class TestsGuardian(APITestCase):
body = {'some': "some_new"}
response = self.client.patch('/permissionless-dummys/{}/'.format(dummy_without.slug), data=json.dumps(body),
content_type='application/ld+json')
self.assertEqual(response.status_code, 403)
self.assertEqual(response.status_code, 404)
# TODO: PUT container of many objects approved on specific resource for which I do not have _model_ permissions
# test that custom permissions are returned on a model
def test_custom_permissions(self):
self.setUpLoggedInUser()
self.setUpGuardianDummyWithPerms(['custom_permission'])
self.setUpGuardianDummyWithPerms(['custom_permission', 'view'])
permissions = LDPPermissions()
result = permissions.user_permissions(self.user, self.dummy)
self.assertIn('custom_permission', result)
response = self.client.get('/permissionless-dummys/{}/'.format(self.dummy.slug))
self.assertIn('custom_permission', self._unpack_permissions(response.data['permissions']))
# test that duplicate permissions aren't returned
def test_no_duplicate_permissions(self):
......@@ -99,6 +158,11 @@ class TestsGuardian(APITestCase):
assign_perm('view_' + model_name, self.user, dummy)
permissions = LDPPermissions()
result = permissions.user_permissions(self.user, dummy)
self.assertEqual(result.count('view'), 1)
response = self.client.get('/dummys/{}/'.format(dummy.slug))
self.assertEqual(response.status_code, 200)
perms = self._unpack_permissions(response.data['permissions'])
self.assertIn('view', perms)
view_perms = [perm for perm in perms if perm == 'view']
self.assertEqual(len(view_perms), 1)
# TODO: attempting to migrate my object permissions by changing FK reference
import json
from django.conf import settings
from django.contrib.auth import get_user_model
from django.test import override_settings
from rest_framework.test import APIClient, APITestCase
from djangoldp.tests.models import Circle, CircleMember, Project, UserProfile
from djangoldp.models import Activity, Follower
from djangoldp.tests.models import Circle, DateChild, DateModel, Project
class TestsInbox(APITestCase):
def setUp(self):
self.client = APIClient(enforce_csrf_checks=True)
self.user = get_user_model().objects.create_user(username='john', email='jlennon@beatles.com',
password='glass onion')
def _get_activity_request_template(self, type, obj, target=None, origin=None):
res = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "https://cdn.startinblox.com/owl#"}
],
"summary": "Something happened",
"type": type,
"actor": {
"type": "Service",
"name": "Backlinks Service",
"inbox": "http://127.0.0.1:8000/inbox/"
},
"object": obj
}
if target is not None:
res.update({"target": target})
if origin is not None:
res.update({"origin": origin})
return res
def _build_target_from_user(self, user):
return {
"@type": "foaf:user",
"name": user.get_full_name(),
"@id": user.urlid
}
def _assert_activity_created(self, response, activity_len=1):
'''Auxiliary function asserts that the activity was created and returned correctly'''
activities = Activity.objects.all()
self.assertEqual(len(activities), activity_len)
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
def _assert_follower_created(self, local_urlid, external_urlid):
existing_followers = Follower.objects.filter(object=local_urlid).values_list('follower', flat=True)
self.assertTrue(external_urlid in existing_followers)
#
# CREATE ACTIVITY
#
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
def test_create_activity_circle(self):
# a local user has been set as the owner of a distant circle
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
],
"summary": "A circle was created",
"type": "Create",
"actor": {
"type": "Service",
"name": "Backlinks Service"
},
"object": {
obj = {
"@type": "hd:circle",
"@id": "https://distant.com/circles/1/",
"owner": {
"@type": "foaf:user",
"@id": user.urlid
"@id": self.user.urlid
}
}
}
payload = self._get_activity_request_template("Create", obj)
response = self.client.post('/inbox/',
data=json.dumps(payload), content_type='application/ld+json')
......@@ -45,43 +78,80 @@ class TestsInbox(APITestCase):
# assert that the circle was created and the user associated as owner
circles = Circle.objects.all()
activities = Activity.objects.all()
self.assertEquals(len(circles), 1)
self.assertEquals(len(activities), 1)
self.assertEqual(len(circles), 1)
self.assertIn("https://distant.com/circles/1/", circles.values_list('urlid', flat=True))
self.assertEqual(circles[0].owner, user)
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
self.assertEqual(circles[0].owner, self.user)
self._assert_activity_created(response)
# assert external circle member now following local user
self.assertEqual(Follower.objects.count(), 1)
self._assert_follower_created(self.user.urlid, "https://distant.com/circles/1/")
# # tests creation, and tests that consequential creation also happens
# # i.e. that I pass it an external circle which it doesn't know about, and it creates that too
# def test_create_activity_circle_member(self):
# obj = {
# "@type": "hd:circlemember",
# "@id": "https://distant.com/circlemembers/1/",
# "user": {
# "@type": "foaf:user",
# "@id": self.user.urlid
# },
# "circle": {
# "@type": "hd:circle",
# "@id": "https://distant.com/circles/1/"
# }
# }
# payload = self._get_activity_request_template("Create", obj)
# response = self.client.post('/inbox/',
# data=json.dumps(payload), content_type='application/ld+json')
# self.assertEqual(response.status_code, 201)
# # assert that the circle was created and the user associated as member
# circles = Circle.objects.all()
# self.assertEqual(len(circles), 1)
# self.assertIn("https://distant.com/circles/1/", circles.values_list('urlid', flat=True))
# self.assertTrue(circles[0].members.filter(user=self.user).exists())
# self._assert_activity_created(response)
# # assert external circle member now following local user
# self._assert_follower_created(self.user.urlid, "https://distant.com/circlemembers/1/")
# sender has sent a circle with a local user that doesn't exist
def test_create_activity_circle_local(self):
urlid = '{}/{}'.format(settings.SITE_URL, 'someonewhodoesntexist')
obj = {
"@type": "hd:circle",
"@id": "https://distant.com/circles/1/",
"owner": {
"@type": "foaf:user",
"@id": urlid
}
}
payload = self._get_activity_request_template("Create", obj)
prior_users_length = get_user_model().objects.count()
response = self.client.post('/inbox/',
data=json.dumps(payload), content_type='application/ld+json')
self.assertEqual(response.status_code, 404)
# assert that the circle was not created neither a backlinked user
self.assertEqual(Circle.objects.count(), 0)
self.assertEqual(get_user_model().objects.count(), prior_users_length)
#
# ADD ACTIVITIES
#
# project model has a direct many-to-many with User
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
def test_add_activity_project(self):
# a local user has joined a distant project
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
],
"summary": user.get_full_name() + " was added to Test Project",
"type": "Add",
"actor": {
"type": "Service",
"name": "Backlinks Service"
},
"object": {
"@type": "hd:project",
"@id": "https://distant.com/projects/1/"
},
"target": {
"@type": "foaf:user",
"name": user.get_full_name(),
"@id": user.urlid
}
obj = {
"@type": "hd:project",
"@id": "https://distant.com/projects/1/"
}
payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
response = self.client.post('/inbox/',
data=json.dumps(payload), content_type='application/ld+json')
......@@ -89,190 +159,335 @@ class TestsInbox(APITestCase):
# assert that the project backlink(s) & activity were created
projects = Project.objects.all()
user_projects = user.projects.all()
activities = Activity.objects.all()
self.assertEquals(len(projects), 1)
self.assertEquals(len(user_projects), 1)
self.assertEquals(len(activities), 1)
user_projects = self.user.projects.all()
self.assertEqual(len(projects), 1)
self.assertEqual(len(user_projects), 1)
self.assertIn("https://distant.com/projects/1/", projects.values_list('urlid', flat=True))
self.assertIn("https://distant.com/projects/1/", user_projects.values_list('urlid', flat=True))
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
self._assert_activity_created(response)
# assert external circle member now following local user
self.assertEqual(Follower.objects.count(), 1)
self._assert_follower_created(self.user.urlid, "https://distant.com/projects/1/")
#TODO: write a new test for the new circle architecture
# # circle model has a many-to-many with user, through an intermediate model
# @override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
# def test_add_activity_circle(self):
# ext_circlemember_urlid = "https://distant.com/circle-members/1/"
# ext_circle_urlid = "https://distant.com/circles/1/"
# obj = {
# "@type": "hd:circlemember",
# "@id": ext_circlemember_urlid,
# "user": {
# "@type": "foaf:user",
# "@id": self.user.urlid
# },
# "circle": {
# "@type": "hd:circle",
# "@id": ext_circle_urlid
# }
# }
# payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
# response = self.client.post('/inbox/',
# data=json.dumps(payload), content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# self.assertEqual(response.status_code, 201)
# # assert that the circle backlink(s) & activity were created
# circles = Circle.objects.all()
# user_circles = self.user.circles.all()
# self.assertEqual(len(circles), 1)
# self.assertEqual(len(user_circles), 1)
# self.assertIn(ext_circle_urlid, circles.values_list('urlid', flat=True))
# self.assertIn(ext_circlemember_urlid, user_circles.values_list('urlid', flat=True))
# self._assert_activity_created(response)
# # assert external circle member now following local user
# self.assertEqual(Follower.objects.count(), 1)
# self._assert_follower_created(self.user.urlid, ext_circlemember_urlid)
# circle model has a many-to-many with user, through an intermediate model
def test_add_activity_circle(self):
# a local user has joined a distant circle
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
# test sending an add activity when the backlink already exists
# @override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
# def test_add_activity_object_already_added(self):
# circle = Circle.objects.create(urlid="https://distant.com/circles/1/")
# circle.members.user_set.add(self.user)
# obj = {
# "@type": "hd:circlemember",
# "@id": "https://distant.com/circle-members/1/",
# "user": {
# "@type": "foaf:user",
# "@id": self.user.urlid
# },
# "circle": {
# "@type": "hd:circle",
# "@id": "https://distant.com/circles/1/"
# }
# }
# payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
# prior_count = Activity.objects.count()
# response = self.client.post('/inbox/',
# data=json.dumps(payload),
# content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# self.assertEqual(response.status_code, 201)
# # assert that the circle backlink(s) & activity were created
# circles = Circle.objects.all()
# user_circles = self.user.circles.all()
# self.assertEqual(len(circles), 1)
# self.assertEqual(len(user_circles), 1)
# self.assertIn("https://distant.com/circles/1/", circles.values_list('urlid', flat=True))
# self.assertIn("https://distant.com/circle-members/1/", user_circles.values_list('urlid', flat=True))
# self._assert_activity_created(response)
# self.assertEqual(Activity.objects.count(), prior_count + 1)
# # assert that followers exist for the external urlids
# self.assertEqual(Follower.objects.count(), 1)
# self._assert_follower_created(self.user.urlid, '') #TODO: replace with an existing model
# TODO: https://git.startinblox.com/djangoldp-packages/djangoldp/issues/250
def test_add_activity_str_parameter(self):
payload = self._get_activity_request_template("Add", "https://distant.com/somethingunknown/1/",
self._build_target_from_user(self.user))
response = self.client.post('/inbox/',
data=json.dumps(payload),
content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
self.assertEqual(response.status_code, 400)
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
],
"summary": user.get_full_name() + " was added to Test Circle",
"type": "Add",
"actor": {
"type": "Service",
"name": "Backlinks Service"
},
"object": {
"@type": "hd:circlemember",
"@id": "https://distant.com/circle-members/1/",
"user": {
"@type": "foaf:user",
"@id": user.urlid
},
"circle": {
"@type": "hd:circle",
"@id": "https://distant.com/circles/1/"
}
},
"target": {
"@type": "foaf:user",
"name": user.get_full_name(),
"@id": user.urlid
}
}
# TODO: may pass an object without an explicit urlid e.g. Person actor, or Collection target
# error behaviour - unknown model
def test_add_activity_unknown(self):
obj = {
"@type": "hd:somethingunknown",
"@id": "https://distant.com/somethingunknown/1/"
}
payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
response = self.client.post('/inbox/',
data=json.dumps(payload), content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
self.assertEqual(response.status_code, 201)
# assert that the circle backlink(s) & activity were created
circles = Circle.objects.all()
user_circles = user.circles.all()
activities = Activity.objects.all()
self.assertEquals(len(circles), 1)
self.assertEquals(len(user_circles), 1)
self.assertEquals(len(activities), 1)
self.assertIn("https://distant.com/circles/1/", circles.values_list('urlid', flat=True))
self.assertIn("https://distant.com/circle-members/1/", user_circles.values_list('urlid', flat=True))
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
# test sending an add activity when the backlink already exists
def test_add_activity_object_already_added(self):
# a local user has joined a distant circle
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
# ..but the receiver already knows about it
circle = Circle.objects.create(urlid="https://distant.com/circles/1/", is_backlink=True)
CircleMember.objects.create(urlid="https://distant.com/circle-members/1/", circle=circle, user=user,
is_backlink=True)
self.assertEqual(response.status_code, 404)
def _test_fail_behaviour(self, response, status_code=400):
self.assertEqual(response.status_code, 400)
# assert that nothing was created
self.assertEqual(Circle.objects.count(), 0)
self.assertEqual(self.user.owned_circles.count(), 0)
self.assertEqual(Activity.objects.count(), 0)
self.assertEqual(Follower.objects.count(), 0)
# # error behaviour - invalid url
# @override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
# def test_add_activity_empty_url(self):
# # an invalid url
# ext_circlemember_urlid = "https://distant.com/circle-members/1/"
# ext_circle_urlid = ""
# obj = {
# "@type": "hd:circlemember",
# "@id": ext_circlemember_urlid,
# "user": {
# "@type": "foaf:user",
# "@id": self.user.urlid
# },
# "circle": {
# "@type": "hd:circle",
# "@id": ext_circle_urlid
# }
# }
# payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
# response = self.client.post('/inbox/',
# data=json.dumps(payload),
# content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# self._test_fail_behaviour(response, 400)
# # error behaviour - invalid url
# @override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
# def test_add_activity_invalid_url(self):
# # an invalid url
# ext_circlemember_urlid = "https://distant.com/circle-members/1/"
# ext_circle_urlid = "not$valid$url"
# obj = {
# "@type": "hd:circlemember",
# "@id": ext_circlemember_urlid,
# "user": {
# "@type": "foaf:user",
# "@id": self.user.urlid
# },
# "circle": {
# "@type": "hd:circle",
# "@id": ext_circle_urlid
# }
# }
# payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
# response = self.client.post('/inbox/',
# data=json.dumps(payload),
# content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# self._test_fail_behaviour(response, 400)
# # # error behaviour - None url
# # @override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
# # def test_add_activity_none_url(self):
# # # an invalid url
# # ext_circlemember_urlid = "https://distant.com/circle-members/1/"
# # ext_circle_urlid = None
# # obj = {
# # "@type": "hd:circlemember",
# # "@id": ext_circlemember_urlid,
# # "user": {
# # "@type": "foaf:user",
# # "@id": self.user.urlid
# # },
# # "circle": {
# # "@type": "hd:circle",
# # "@id": ext_circle_urlid
# # }
# # }
# # payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
# # response = self.client.post('/inbox/',
# # data=json.dumps(payload),
# # content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# # self._test_fail_behaviour(response, 400)
# # missing @id on a sub-object
# @override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
# def test_add_activity_no_id(self):
# ext_circlemember_urlid = "https://distant.com/circle-members/1/"
# obj = {
# "@type": "hd:circlemember",
# "@id": ext_circlemember_urlid,
# "user": {
# "@type": "foaf:user",
# "@id": self.user.urlid
# },
# "circle": {
# "@type": "hd:circle"
# }
# }
# payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
# response = self.client.post('/inbox/',
# data=json.dumps(payload),
# content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# self._test_fail_behaviour(response, 400)
# # missing @type on a sub-object
# @override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
# def test_add_activity_no_type(self):
# ext_circlemember_urlid = "https://distant.com/circle-members/1/"
# obj = {
# "@type": "hd:circlemember",
# "@id": ext_circlemember_urlid,
# "user": {
# "@type": "foaf:user",
# "@id": self.user.urlid
# },
# "circle": {
# "@id": "https://distant.com/circles/1/"
# }
# }
# payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
# response = self.client.post('/inbox/',
# data=json.dumps(payload),
# content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# self._test_fail_behaviour(response, 404)
def test_invalid_activity_missing_actor(self):
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
{"hd": "https://cdn.startinblox.com/owl#"}
],
"summary": user.get_full_name() + " was added to Test Circle",
"summary": "Test was added to Test Circle",
"type": "Add",
"actor": {
"type": "Service",
"name": "Backlinks Service"
},
"object": {
"@type": "hd:circlemember",
"@id": "https://distant.com/circle-members/1/",
"user": {
"@type": "foaf:user",
"@id": user.urlid
},
"circle": {
"@type": "hd:circle",
"@id": "https://distant.com/circles/1/"
}
"@type": "hd:somethingunknown",
"@id": "https://distant.com/somethingunknown/1/"
},
"target": {
"@type": "foaf:user",
"name": user.get_full_name(),
"@id": user.urlid
"@id": self.user.urlid
}
}
response = self.client.post('/inbox/',
data=json.dumps(payload),
content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
self.assertEqual(response.status_code, 400)
# test activity setting unsafe fields in object
def test_unsafe_fields_in_activity(self):
obj = {
"@type": "hd:project",
"@id": "https://distant.com/projects/1/",
"pk": 100,
"id": 100
}
payload = self._get_activity_request_template("Add", obj, self._build_target_from_user(self.user))
response = self.client.post('/inbox/',
data=json.dumps(payload), content_type='application/ld+json')
self.assertEqual(response.status_code, 201)
# assert that the circle backlink(s) & activity were created
circles = Circle.objects.all()
user_circles = user.circles.all()
activities = Activity.objects.all()
self.assertEquals(len(circles), 1)
self.assertEquals(len(user_circles), 1)
self.assertEquals(len(activities), 1)
self.assertIn("https://distant.com/circles/1/", circles.values_list('urlid', flat=True))
self.assertIn("https://distant.com/circle-members/1/", user_circles.values_list('urlid', flat=True))
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
# TODO: adding to a model which has multiple relationships with this RDF type
# error behaviour - unknown model
def test_add_activity_unknown(self):
# a local user has joined a distant circle
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
],
"summary": user.get_full_name() + " was added to Test Circle",
"type": "Add",
"actor": {
"type": "Service",
"name": "Backlinks Service"
},
"object": {
"@type": "hd:somethingunknown",
"@id": "https://distant.com/somethingunknown/1/"
},
"target": {
"@type": "foaf:user",
"name": user.get_full_name(),
"@id": user.urlid
# assert that the project backlink(s) & activity were created
projects = Project.objects.all()
user_projects = self.user.projects.all()
self.assertEqual(len(projects), 1)
self.assertEqual(len(user_projects), 1)
self.assertIn("https://distant.com/projects/1/", projects.values_list('urlid', flat=True))
self.assertIn("https://distant.com/projects/1/", user_projects.values_list('urlid', flat=True))
self._assert_activity_created(response)
backlink = Project.objects.get(urlid="https://distant.com/projects/1/")
self.assertNotEqual(backlink.pk, 100)
def test_missing_not_null_field_activity(self):
# TODO: catch the warning
# DateChild must not have a null reference to parent
# and parent must not have a null field 'date', which here is missing
obj = {
"@type": "hd:datechild",
"@id": "https://distant.com/datechilds/1/",
"parent": {
"@type": "hd:date",
"@id": "https://distant.com/dates/1/"
}
}
payload = self._get_activity_request_template("Create", obj)
response = self.client.post('/inbox/',
data=json.dumps(payload), content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
self.assertEqual(response.status_code, 404)
response = self.client.post('/inbox/', data=json.dumps(payload), content_type='application/ld+json')
self.assertEqual(response.status_code, 200)
dates = DateModel.objects.all()
date_children = DateChild.objects.all()
self.assertEqual(len(dates), 0)
self.assertEqual(len(date_children), 0)
#
# REMOVE & DELETE ACTIVITIES
#
# project model has a direct many-to-many with User
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
def test_remove_activity_project_using_origin(self):
# a local user has a distant project attached
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
project = Project.objects.create(urlid="https://distant.com/projects/1/", is_backlink=True)
user.projects.add(project)
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
],
"summary": user.get_full_name() + " removed Test Project",
"type": "Remove",
"actor": {
"type": "Service",
"name": "Backlinks Service"
},
"object": {
"@type": "hd:project",
"@id": "https://distant.com/projects/1/"
},
"origin": {
"@type": "foaf:user",
"name": user.get_full_name(),
"@id": user.urlid
}
project = Project.objects.create(urlid="https://distant.com/projects/1/")
self.user.projects.add(project)
Follower.objects.create(object=self.user.urlid, inbox='https://distant.com/inbox/',
follower=project.urlid, is_backlink=True)
prior_activity_count = Activity.objects.count()
obj = {
"@type": "hd:project",
"@id": "https://distant.com/projects/1/"
}
payload = self._get_activity_request_template("Remove", obj, origin=self._build_target_from_user(self.user))
response = self.client.post('/inbox/',
data=json.dumps(payload),
content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
......@@ -280,65 +495,93 @@ class TestsInbox(APITestCase):
# assert that the circle backlink(s) were removed & activity were created
projects = Project.objects.all()
user_projects = user.projects.all()
activities = Activity.objects.all()
self.assertEquals(len(projects), 1)
self.assertEquals(len(user_projects), 0)
self.assertEquals(len(activities), 1)
user_projects = self.user.projects.all()
self.assertEqual(len(projects), 1)
self.assertEqual(len(user_projects), 0)
self.assertIn("https://distant.com/projects/1/", projects.values_list('urlid', flat=True))
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
self._assert_activity_created(response, prior_activity_count + 1)
self.assertEqual(Follower.objects.count(), 0)
# TODO: test_remove_activity_project_using_target
# TODO: error behaviour - project does not exist on user
# TODO: test_remove_activity_project_using_target (https://git.startinblox.com/djangoldp-packages/djangoldp/issues/231)
# Delete CircleMember
def test_delete_activity_circle_using_origin(self):
# a local user has a distant circle attached
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
circle = Circle.objects.create(urlid="https://distant.com/circles/1/", allow_create_backlink=False)
CircleMember.objects.create(urlid="https://distant.com/circle-members/1/",circle=circle, user=user,
is_backlink=True)
# error behaviour - project does not exist on user
def test_remove_activity_nonexistent_project(self):
Project.objects.create(urlid="https://distant.com/projects/1/")
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
],
"summary": "CircleMember was deleted",
"type": "Delete",
"actor": {
"type": "Service",
"name": "Backlinks Service"
},
"object": {
"@type": "hd:circlemember",
"@id": "https://distant.com/circle-members/1/",
"user": {
"@type": "foaf:user",
"@id": user.urlid
},
"circle": {
"@type": "hd:circle",
"@id": "https://distant.com/circles/1/"
}
}
obj = {
"@type": "hd:project",
"@id": "https://distant.com/projects/1/"
}
payload = self._get_activity_request_template("Remove", obj, origin=self._build_target_from_user(self.user))
response = self.client.post('/inbox/',
data=json.dumps(payload),
content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
self.assertEqual(response.status_code, 201)
self._assert_activity_created(response)
@override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX='DEBUG')
def test_removing_object_twice(self):
project = Project.objects.create(urlid="https://distant.com/projects/1/")
self.user.projects.add(project)
prior_count = Activity.objects.all().count()
# remove once via activity
obj = {
"@type": "hd:project",
"@id": "https://distant.com/projects/1/"
}
payload = self._get_activity_request_template("Remove", obj, origin=self._build_target_from_user(self.user))
response = self.client.post('/inbox/',
data=json.dumps(payload),
content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
self.assertEqual(response.status_code, 201)
# received and then sent
self.assertEqual(Activity.objects.all().count(), prior_count + 2)
prior_count = Activity.objects.all().count()
# assert that the CircleMember was deleted and activity was created
circles = Circle.objects.all()
user_circles = user.circles.all()
activities = Activity.objects.all()
self.assertEquals(len(circles), 1)
self.assertEquals(len(user_circles), 0)
self.assertEquals(len(activities), 1)
self.assertIn("https://distant.com/circles/1/", circles.values_list('urlid', flat=True))
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
# sending remove activity again
payload = self._get_activity_request_template("Remove", obj, origin=self._build_target_from_user(self.user))
response = self.client.post('/inbox/',
data=json.dumps(payload),
content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# just received, did not send
self.assertEqual(Activity.objects.all().count(), prior_count + 1)
# # Delete CircleMember
# @override_settings(SEND_BACKLINKS=True, DISABLE_OUTBOX=True)
# def test_delete_activity_circle_using_origin(self):
# circle = Circle.objects.create(urlid="https://distant.com/circles/1/", allow_create_backlink=False)
# circle.members.user_set.add(self.user)
# Follower.objects.create(object=self.user.urlid, inbox='https://distant.com/inbox/',
# follower=circle.urlid, is_backlink=True)
# obj = {
# "@type": "hd:circlemember",
# "@id": "https://distant.com/circle-members/1/",
# "user": {
# "@type": "foaf:user",
# "@id": self.user.urlid
# },
# "circle": {
# "@type": "hd:circle",
# "@id": "https://distant.com/circles/1/"
# }
# }
# payload = self._get_activity_request_template("Delete", obj)
# response = self.client.post('/inbox/',
# data=json.dumps(payload),
# content_type='application/ld+json;profile="https://www.w3.org/ns/activitystreams"')
# self.assertEqual(response.status_code, 201)
# # assert that the Circle member was removed and activity was created
# circles = Circle.objects.all()
# user_circles = self.user.circles.all()
# self.assertEqual(len(circles), 1)
# self.assertEqual(circle.members.count(), 0)
# self.assertEqual(len(user_circles), 0)
# self.assertIn("https://distant.com/circles/1/", circles.values_list('urlid', flat=True))
# self._assert_activity_created(response)
# self.assertEqual(Follower.objects.count(), 0)
# TODO: test_delete_activity_circle_using_target
......@@ -346,77 +589,44 @@ class TestsInbox(APITestCase):
# UPDATE Activities
#
def test_update_activity_circle(self):
# a local user was set as the owner of a distant circle, but the owner has been changed
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
circle = Circle.objects.create(urlid="https://distant.com/circles/1/", owner=self.user)
self.assertEqual(circle.owner, self.user)
circle = Circle.objects.create(urlid="https://distant.com/circles/1/", owner=user, is_backlink=True)
self.assertEqual(circle.owner, user)
prior_user_count = get_user_model().objects.count()
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
],
"summary": "A circle was updated",
"type": "Update",
"actor": {
"type": "Service",
"name": "Backlinks Service"
},
"object": {
obj = {
"@type": "hd:circle",
"@id": "https://distant.com/circles/1/",
"owner": {
"@type": "foaf:user",
"@id": "https://distant.com/users/1/"
}
}
}
payload = self._get_activity_request_template("Update", obj)
response = self.client.post('/inbox/',
data=json.dumps(payload), content_type='application/ld+json')
self.assertEqual(response.status_code, 201)
# assert that the circle was created and the user associated as owner
circles = Circle.objects.all()
activities = Activity.objects.all()
users = get_user_model().objects.all()
self.assertEquals(len(circles), 1)
self.assertEquals(len(activities), 1)
self.assertEquals(len(users), 2)
self.assertEqual(len(circles), 1)
self.assertEqual(len(users), prior_user_count + 1)
distant_user = get_user_model().objects.get(urlid="https://distant.com/users/1/")
self.assertIn("https://distant.com/circles/1/", circles.values_list('urlid', flat=True))
self.assertEqual(circles[0].owner, distant_user)
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
self._assert_activity_created(response)
#
# FOLLOW activities
#
def test_follow_activity(self):
# a local user was set as the owner of a distant circle, but the owner has been changed
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
circle = Circle.objects.create(description='Test Description')
payload = {
"@context": [
"https://www.w3.org/ns/activitystreams",
{"hd": "http://happy-dev.fr/owl/#"}
],
"summary": user.urlid + " followed " + circle.urlid,
"type": "Follow",
"actor": {
"type": "Service",
"name": "Backlinks Service",
"inbox": "http://127.0.0.1:8000/inbox/"
},
"object": {
"@type": "hd:circle",
"@id": circle.urlid
}
obj = {
"@type": "hd:circle",
"@id": circle.urlid
}
payload = self._get_activity_request_template("Follow", obj)
response = self.client.post('/inbox/',
data=json.dumps(payload), content_type='application/ld+json')
......@@ -424,26 +634,21 @@ class TestsInbox(APITestCase):
# assert that Follower was created with correct values
followers = Follower.objects.all()
activities = Activity.objects.all()
self.assertEquals(len(followers), 1)
self.assertEquals(len(activities), 1)
self.assertIn(response["Location"], activities.values_list('urlid', flat=True))
self.assertEqual(len(followers), 1)
self._assert_activity_created(response)
follower = followers[0]
self.assertEqual("http://127.0.0.1:8000/inbox/", follower.inbox)
self.assertEqual(circle.urlid, follower.object)
# test Followers are auto-deleted when the object they're following is deleted
def test_follower_auto_delete(self):
user = get_user_model().objects.create(username='john', email='jlennon@beatles.com', password='glass onion')
UserProfile.objects.create(user=user)
circle = Circle.objects.create(description='Test Description')
Follower.objects.create(object=circle.urlid, inbox="http://127.0.0.1:8000/inbox/")
followers = Follower.objects.all()
self.assertEquals(len(followers), 1)
self.assertEqual(len(followers), 1)
circle.delete()
followers = Follower.objects.all()
self.assertEquals(len(followers), 0)
self.assertEqual(len(followers), 0)
#
# GET Inbox
......@@ -451,3 +656,6 @@ class TestsInbox(APITestCase):
def test_get_inbox(self):
response = self.client.get('/inbox/')
self.assertEqual(response.status_code, 405)
# TODO: GET inbox for specific resource - should return a list of activities sent to this inbox
# TODO: view to access outbox (https://git.startinblox.com/djangoldp-packages/djangoldp/issues/284)
import unittest
from django.test import TestCase
from djangoldp.models import Model
from djangoldp.tests.models import Dummy, LDPDummy
from djangoldp.tests.models import (Dummy, JobOffer, LDPDummy,
NoSuperUsersAllowedModel)
class LDPModelTest(TestCase):
def test_class_not_inheriting_ldp_model(self):
dummy = Dummy.objects.create(some="text")
self.assertEquals("/dummys/", Model.container_id(dummy))
self.assertEquals("/dummys/{}/".format(dummy.slug), Model.resource_id(dummy))
self.assertEqual("/dummys/", Model.container_id(dummy))
self.assertEqual("/dummys/{}/".format(dummy.slug), Model.resource_id(dummy))
def test_class_inheriting_ldp_model(self):
dummy = LDPDummy.objects.create(some="text")
self.assertEquals("/ldpdummys/", dummy.get_container_id())
self.assertEquals("http://happy-dev.fr/ldpdummys/{}/".format(dummy.pk), dummy.get_absolute_url())
self.assertEquals("/ldpdummys/", Model.container_id(dummy))
self.assertEquals("/ldpdummys/{}/".format(dummy.pk), Model.resource_id(dummy))
self.assertEqual("/ldpdummys/", dummy.get_container_id())
self.assertEqual("http://happy-dev.fr/ldpdummys/{}/".format(dummy.pk), dummy.get_absolute_url())
self.assertEqual("/ldpdummys/", Model.container_id(dummy))
self.assertEqual("/ldpdummys/{}/".format(dummy.pk), Model.resource_id(dummy))
def test_from_resolve_id(self):
saved_instance = Dummy.objects.create(some="text", slug="someid")
result = Model.resolve_id("/dummys/{}/".format(saved_instance.slug))
self.assertEquals(saved_instance, result)
self.assertEqual(saved_instance, result)
def test_resolve_container(self):
result = Model.resolve_container("/dummys/")
self.assertEquals(Dummy, result)
self.assertEqual(Dummy, result)
def test_auto_url(self):
from django.urls import get_resolver
......@@ -35,4 +34,13 @@ class LDPModelTest(TestCase):
view_name = '{}-list'.format(dummy._meta.object_name.lower())
path = 'http://happy-dev.fr/{}{}/'.format(get_resolver().reverse_dict[view_name][0][0][0], dummy.pk)
self.assertEquals(path, dummy.get_absolute_url())
self.assertEqual(path, dummy.get_absolute_url())
def test_ldp_manager_local_objects(self):
local = LDPDummy.objects.create(some='text')
external = LDPDummy.objects.create(some='text', urlid='https://distant.com/ldpdummys/1/')
self.assertEqual(LDPDummy.objects.count(), 2)
local_queryset = LDPDummy.objects.local()
self.assertEqual(local_queryset.count(), 1)
self.assertIn(local, local_queryset)
self.assertNotIn(external, local_queryset)
\ No newline at end of file