diff --git a/pillar/application/modules/blender_cloud/home_project.py b/pillar/application/modules/blender_cloud/home_project.py index ef165219..74bb8fe0 100644 --- a/pillar/application/modules/blender_cloud/home_project.py +++ b/pillar/application/modules/blender_cloud/home_project.py @@ -21,9 +21,26 @@ def create_home_project(user_id): """Creates a home project for the given user.""" log.info('Creating home project for user %s', user_id) - project = projects.create_new_project(project_name='Home', - user_id=ObjectId(user_id), - overrides={'category': 'home'}) + overrides = { + 'category': 'home', + 'summary': 'This is your home project. Pastebin and Blender settings sync in one!', + 'description': '# Your home project\n\n' + 'This is your home project. It has functionality to act ' + 'as a pastebin for text, images and other assets, and ' + 'allows synchronisation of your Blender settings.' + } + + # Maybe the user has a deleted home project. + proj_coll = current_app.data.driver.db['projects'] + deleted_proj = proj_coll.find_one({'user': user_id, 'category': 'home', '_deleted': True}) + if deleted_proj: + log.info('User %s has a deleted project %s, restoring', user_id, deleted_proj['_id']) + project = deleted_proj + else: + log.debug('User %s does not have a deleted project', user_id) + project = projects.create_new_project(project_name='Home', + user_id=ObjectId(user_id), + overrides=overrides) # Re-validate the authentication token, so that the put_internal call sees the # new group created for the project. @@ -99,7 +116,7 @@ def has_home_project(user_id): """Returns True iff the user has a home project.""" proj_coll = current_app.data.driver.db['projects'] - return proj_coll.count({'user': user_id, 'category': 'home'}) > 0 + return proj_coll.count({'user': user_id, 'category': 'home', '_deleted': False}) > 0 def setup_app(app, url_prefix): diff --git a/tests/test_bcloud_home_project.py b/tests/test_bcloud_home_project.py index ce4c7af9..3234e82f 100644 --- a/tests/test_bcloud_home_project.py +++ b/tests/test_bcloud_home_project.py @@ -115,9 +115,16 @@ class HomeProjectTest(AbstractPillarTest): validate_token() self.assertFalse(home_project.has_home_project(user_id)) - home_project.create_home_project(user_id) + proj = home_project.create_home_project(user_id) self.assertTrue(home_project.has_home_project(user_id)) + # Delete the project. + resp = self.client.delete('/projects/%s' % proj['_id'], + headers={'Authorization': self.make_header('token'), + 'If-Match': proj['_etag']}) + self.assertEqual(204, resp.status_code, resp.data) + self.assertFalse(home_project.has_home_project(user_id)) + @responses.activate def test_home_project_projections(self): """Getting the home project should support projections.""" @@ -196,3 +203,29 @@ class HomeProjectTest(AbstractPillarTest): self.assertEqual(json_proj2['_etag'], db_proj2['_etag']) self.assertNotEqual(db_proj1['_etag'], db_proj2['_etag']) self.assertNotEqual(db_proj1['_id'], db_proj2['_id']) + + def test_delete_restore(self): + """Deleting and then recreating a home project should restore the deleted project.""" + + self._create_user_with_token(roles={u'subscriber'}, token='token') + + # Create home project by getting it. + resp = self.client.get('/bcloud/home-project', + headers={'Authorization': self.make_header('token')}) + self.assertEqual(200, resp.status_code, resp.data) + before_delete_json_proj = json.loads(resp.data) + + # Delete the project. + resp = self.client.delete('/projects/%s' % before_delete_json_proj['_id'], + headers={'Authorization': self.make_header('token'), + 'If-Match': before_delete_json_proj['_etag']}) + self.assertEqual(204, resp.status_code, resp.data) + + # Recreate home project by getting it. + resp = self.client.get('/bcloud/home-project', + headers={'Authorization': self.make_header('token')}) + self.assertEqual(200, resp.status_code, resp.data) + after_delete_json_proj = json.loads(resp.data) + + self.assertEqual(before_delete_json_proj['_id'], + after_delete_json_proj['_id'])