blob: 2e22b6bc9612b1f7e1c3cd2e973b948531aec9a5 [file] [log] [blame]
# Copyright 2011 the Melange authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Utils for manipulating program data."""
from codein import types as ci_types
from google.appengine.ext import db
from google.appengine.ext import ndb
from melange import types
from soc.models import document as document_model
from soc.models.org_app_survey import OrgAppSurvey
from soc.models import program as program_model
from soc.models.site import Site
from soc.models.sponsor import Sponsor
from soc.modules.gci.models.organization import GCIOrganization
from soc.modules.seeder.logic.providers import string as string_provider
from soc.modules.seeder.logic.seeder import logic as seeder_logic
from summerofcode import types as soc_types
from tests import org_utils
from tests import profile_utils
from tests import timeline_utils
# TODO(daniel): move this function to a separate module
def seedSite(**kwargs):
"""Seeds a new site entity.
Returns:
Newly seeded Site entity.
"""
properties = {
'key_name': 'site',
'active_program': None,
}
properties.update(kwargs)
site = Site(**properties)
site.put()
return site
TEST_SPONSOR_EMIAL = 'test.sponsor@example.com'
TEST_SPONSOR_HOME_PAGE = 'http://test.sponsor.home.page.com'
TEST_SPONSOR_NAME = 'Test Sponsor'
TEST_SPONSOR_DESCRIPTION = 'Test Sponsor Description'
TEST_SPONSOR_SHORT_NAME = 'Sponsor'
# TODO(daniel): move this function to a separate module
def seedSponsor(sponsor_id=None, **kwargs):
"""Seeds a new sponsor entity.
Args:
sponsor_id: Identifier of the new sponsor.
Returns:
Newly seeded Sponsor entity.
"""
sponsor_id = sponsor_id or string_provider.UniqueIDProvider().getValue()
properties = {
'description': TEST_SPONSOR_DESCRIPTION,
'email': TEST_SPONSOR_EMIAL,
'home_page': TEST_SPONSOR_HOME_PAGE,
'key_name': sponsor_id,
'link_id': sponsor_id,
'org_id': sponsor_id,
'name': TEST_SPONSOR_NAME,
'short_name': TEST_SPONSOR_SHORT_NAME,
'sponsor_id': sponsor_id,
}
properties.update(kwargs)
sponsor = Sponsor(**properties)
sponsor.put()
return sponsor
def seedTimeline(models=types.MELANGE_MODELS,
timeline_id=None, sponsor_key=None, **kwargs):
"""Seeds a new timeline.
Args:
models: Instance of types.Models that represent appropriate models.
timeline_id: Identifier of the new timeline.
sponsor_key: Sponsor key to be used as scope for the timeline.
Returns:
Newly seeded timeline entity.
"""
timeline_id = timeline_id or string_provider.UniqueIDProvider().getValue()
sponsor_key = sponsor_key or seedSponsor().key()
properties = {
'key_name': '%s/%s' % (sponsor_key.name(), timeline_id),
'link_id': timeline_id,
'program_start': timeline_utils.past(),
'program_end': timeline_utils.future(),
'scope': sponsor_key,
}
properties.update(kwargs)
timeline = models.timeline_model(**properties)
timeline.put()
return timeline
TEST_PROGRAM_DESCRIPTION = 'Test Program Description'
TEST_PROGRAM_NAME = 'Test Program'
TEST_PROGRAM_SHORT_NAME = 'Program'
TEST_PROGRAM_EVENTS_FRAME_URL = 'https://subdomain.example.tld/events.calendar'
TEST_DOCUMENT_PREFIX = 'program'
TEST_DOCUMENT_TITLE = 'Test Document'
def seedProgram(models=types.MELANGE_MODELS, program_id=None,
sponsor_key=None, timeline_key=None, host=None, **kwargs):
"""Seeds a new program.
Args:
models: instance of types.Models that represent appropriate models.
program_id: Identifier of the new program.
sponsor_key: Sponsor key for the new program.
timeline_key: Timeline key for the new program.
host: Optional user to be set as a host for the new program.
Returns:
Newly seeded program entity.
"""
program_id = program_id or string_provider.UniqueIDProvider().getValue()
sponsor_key = sponsor_key or seedSponsor().key()
timeline_key = timeline_key or seedTimeline(
models=models, timeline_id=program_id, sponsor_key=sponsor_key).key()
properties = {
'scope': sponsor_key,
'sponsor': sponsor_key,
'link_id': program_id,
'program_id': program_id,
'key_name': '%s/%s' % (sponsor_key.name(), program_id),
'name': TEST_PROGRAM_NAME,
'short_name': TEST_PROGRAM_SHORT_NAME,
'description': TEST_PROGRAM_DESCRIPTION,
'timeline': timeline_key,
'status': program_model.STATUS_VISIBLE,
'events_frame_url': TEST_PROGRAM_EVENTS_FRAME_URL,
}
properties.update(kwargs)
program = models.program_model(**properties)
if host:
host.host_for.append(ndb.Key.from_old_key(program.key()))
host.put()
else:
host = profile_utils.seedNDBUser(host_for=[program])
document_id = string_provider.UniqueIDProvider().getValue()
prefix = kwargs.get('prefix', TEST_DOCUMENT_PREFIX)
properties = {
'scope': program,
'read_access': 'public',
'key_name': '%s/%s/%s' % (prefix, program.key().name(), document_id),
'link_id': document_id,
'modified_by': host.key.to_old_key(),
'author': host.key.to_old_key(),
'home_for': None,
'title': TEST_DOCUMENT_TITLE,
'prefix': prefix,
}
document = document_model.Document(**properties)
document.put()
program.about_page = document
program.events_page = document
program.help_page = document
program.connect_with_us_page = document
program.privacy_policy = document
program.put()
seedProgramMessages(models=models, program_key=program.key(), **kwargs)
return program
TEST_APP_TASKS_LIMIT = 20
TEST_SLOTS = 1000
def seedGSoCProgram(program_id=None, sponsor_key=None,
timeline_key=None, **kwargs):
"""Seeds a new Summer Of Code program.
Args:
program_id: Identifier of the new program.
sponsor_key: Sponsor key for the new program.
timeline_key: Timeline key for the new program.
Returns:
Newly seeded program entity.
"""
properties = {
'apps_tasks_limit': TEST_APP_TASKS_LIMIT,
'slots': TEST_SLOTS,
'prefix': 'gsoc_program',
}
properties.update(kwargs)
return seedProgram(
models=soc_types.SOC_MODELS, program_id=program_id,
sponsor_key=sponsor_key, timeline_key=timeline_key, **properties)
def seedGCIProgram(program_id=None, sponsor_key=None,
timeline_key=None, **kwargs):
"""Seeds a new Code In program.
Args:
program_id: Identifier of the new program.
sponsor_key: Sponsor key for the new program.
timeline_key: Timeline key for the new program.
Returns:
Newly seeded program entity.
"""
properties = {'prefix': 'gci_program'}
properties.update(kwargs)
return seedProgram(
models=ci_types.CI_MODELS, program_id=program_id,
sponsor_key=sponsor_key, timeline_key=timeline_key, **properties)
def seedProgramMessages(
models=types.MELANGE_MODELS, program_key=None, **kwargs):
"""Seeds a new program messages.
Args:
models: instance of types.Models that represent appropriate models.
program_key: Program key for messages.
Returns:
Newly seeded program messages entity.
"""
properties = {'parent': program_key}
properties.update(kwargs)
return seeder_logic.seed(models.program_messages_model, properties)
def seedGSoCProgramMessages(program_key=None, **kwargs):
"""Seeds a new program messages for Summer Of Code.
Args:
program_key: Program key for messages.
Returns:
Newly seeded program messages entity.
"""
return seedProgramMessages(
models=soc_types.SOC_MODELS, program_key=program_key, **kwargs)
def seedGCIProgramMessages(program_key=None, **kwargs):
"""Seeds a new program messages for Code In.
Args:
program_key: Program key for messages.
Returns:
Newly seeded program messages entity.
"""
return seedProgramMessages(
models=ci_types.CI_MODELS, program_key=program_key)
def seedApplicationSurvey(program_key, **kwargs):
"""Seeds a new organization application survey for the specified program.
Args:
program_key: Program key to create a survey for.
kwargs: Optional values for other properties of the seeded entity.
Returns:
Newly seeded survey entity.
"""
user = profile_utils.seedNDBUser()
program = db.get(program_key)
properties = {
'scope': program_key,
'program': program_key,
'modified_by': user.key.to_old_key(),
'created_by': user.key.to_old_key(),
'author': user.key.to_old_key(),
'schema': ('[["item"],{"item":{"field_type":"input_text",'
'"required":false, "label":"test"}}]'),
'survey_content': None,
'key_name': '%s/%s/orgapp' % (program.prefix, program_key.name())
}
properties.update(kwargs)
return seeder_logic.seed(OrgAppSurvey, properties)
class ProgramHelper(object):
"""Helper class to aid in manipulating program data."""
def __init__(self, sponsor=None, program=None):
"""Initializes the ProgramHelper.
Args:
sponsor: Sponsor entity.
"""
self.sponsor = sponsor
self.program = program
self.org_app = None
self.org = None
self.site = None
self.createOrg = self.createOrUpdateOrg
def seed(self, model, properties,
auto_seed_optional_properties=True):
return seeder_logic.seed(model, properties, recurse=False,
auto_seed_optional_properties=auto_seed_optional_properties)
def seedn(self, model, properties, n,
auto_seed_optional_properties=True):
return seeder_logic.seedn(model, n, properties, recurse=False,
auto_seed_optional_properties=auto_seed_optional_properties)
def createProgram(self, override=None):
"""Creates a program for the defined properties."""
if self.sponsor is None:
self.sponsor = seedSponsor()
def createOrgApp(self, override=None):
"""Creates an organization application for the defined properties."""
if self.org_app:
return self.org_app
if self.program is None:
self.createProgram()
user = profile_utils.seedNDBUser()
properties = {
'scope': self.program,
'program': self.program,
'modified_by': user.key.to_old_key(),
'created_by': user.key.to_old_key(),
'author': user.key.to_old_key(),
'schema': ('[["item"],{"item":{"field_type":"input_text",'
'"required":false, "label":"test"}}]'),
'survey_content': None,
'key_name': '%s/%s/orgapp' % (
self.program.prefix, self.program.key().name()),
}
properties.update(override or {})
self.org_app = self.seed(OrgAppSurvey, properties)
return self.org_app
def _updateEntity(self, entity, override):
"""Updates self.<entity> with override.
"""
properties = entity.properties()
for name, value in override.iteritems():
properties[name].__set__(entity, value)
entity.put()
return entity
def _updateOrg(self, override):
"""Updates self.org with override.
"""
return self._updateEntity(self.org, override)
def createOrUpdateOrg(self, override=None):
"""Creates or updates an org (self.org) for the defined properties."""
if self.org:
if not override:
return self.org
else:
return self._updateOrg(override or {})
self.org = self.createNewOrg(override or {})
return self.org
def createNewOrg(self, override=None):
"""Creates a new organization for the defined properties.
This new organization will not be stored in self.org but returned.
"""
if self.program is None:
self.createProgram()
class GSoCProgramHelper(ProgramHelper):
"""Helper class to aid in manipulating GSoC program data."""
def __init__(self, **kwargs):
"""Initializes the GSoCProgramHelper.
"""
super(GSoCProgramHelper, self).__init__(**kwargs)
def createProgram(self, override=None):
"""Creates a program for the defined properties."""
if self.program:
return self.program
super(GSoCProgramHelper, self).createProgram()
self.program = seedGSoCProgram(
sponsor_key=self.sponsor.key(), **override or {})
return self.program
def createNewOrg(self, override=None):
"""Creates a new organization for the defined properties.
This new organization will not be stored in self.org but returned.
"""
if not self.program:
self.createProgram()
return org_utils.seedSOCOrganization(self.program.key(), **override or {})
def createOrgApp(self, override=None):
"""Creates an organization application for the defined properties."""
override = override or {}
override.update({
'key_name': 'gsoc_program/%s/orgapp' % self.program.key().name(),
'survey_start': timeline_utils.past(),
'survey_end': timeline_utils.future(),
})
return super(GSoCProgramHelper, self).createOrgApp(override)
class GCIProgramHelper(ProgramHelper):
"""Helper class to aid in manipulating GCI program data."""
def __init__(self, **kwargs):
"""Initializes the GCIProgramHelper.
"""
super(GCIProgramHelper, self).__init__(**kwargs)
def createProgram(self, override=None):
"""Creates a program for the defined properties."""
if self.program:
return self.program
super(GCIProgramHelper, self).createProgram()
self.program = seedGCIProgram(
sponsor_key=self.sponsor.key(), **override or {})
return self.program
def createNewOrg(self, override=None):
"""Creates a new organization for the defined properties.
This new organization will not be stored in self.org but returned.
"""
override = override or {}
super(GCIProgramHelper, self).createNewOrg(override)
properties = {
'scope': self.program,
'status': 'active',
'home': None,
'task_quota_limit': 100,
'backup_winner': None,
'program': self.program,
}
properties.update(override)
return self.seed(GCIOrganization, properties)
def createOrgApp(self, override=None):
"""Creates an organization application for the defined properties."""
override = override or {}
override.update({
'key_name': 'gci_program/%s/orgapp' % self.program.key().name(),
})
return super(GCIProgramHelper, self).createOrgApp(override)
def seedOldOrganization(program_key, **kwargs):
if isinstance(program_key, ndb.Key):
program_key = program_key.to_old_key()
org_id = string_provider.UniqueIDProvider().getValue()
entity_id = '%s/%s' % (program_key.name(), org_id)
properties = {
'description': 'some description',
'link_id': org_id,
'name': 'some name',
'status': 'active',
'home': None,
'task_quota_limit': 100,
'backup_winner': None,
'scope': program_key,
'program': program_key,
'key_name': entity_id,
}
properties.update(kwargs)
return seeder_logic.seed(GCIOrganization, properties)