~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/testing/factory.py

Undo rename. Again.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf-8 -*-
2
 
# NOTE: The first line above must stay first; do not move the copyright
3
 
# notice to the top.  See http://www.python.org/dev/peps/pep-0263/.
4
 
#
5
1
# Copyright 2009-2011 Canonical Ltd.  This software is licensed under the
6
2
# GNU Affero General Public License version 3 (see the file LICENSE).
7
3
 
162
158
from lp.code.model.diff import (
163
159
    Diff,
164
160
    PreviewDiff,
 
161
    StaticDiff,
165
162
    )
166
163
from lp.code.model.recipebuild import RecipeBuildRecord
167
164
from lp.codehosting.codeimport.worker import CodeImportSourceDetails
306
303
    TranslationFileFormat,
307
304
    )
308
305
from lp.translations.interfaces.translationgroup import ITranslationGroupSet
309
 
from lp.translations.interfaces.translationimportqueue import (
310
 
    ITranslationImportQueue,
311
 
    )
312
306
from lp.translations.interfaces.translationmessage import (
313
307
    RosettaTranslationOrigin,
314
308
    )
317
311
    ITranslationTemplatesBuildJobSource,
318
312
    )
319
313
from lp.translations.interfaces.translator import ITranslatorSet
 
314
from lp.translations.model.translationimportqueue import (
 
315
    TranslationImportQueueEntry,
 
316
    )
320
317
from lp.translations.model.translationtemplateitem import (
321
318
    TranslationTemplateItem,
322
319
    )
477
474
            branch_id = self.getUniqueInteger()
478
475
        if rcstype is None:
479
476
            rcstype = 'svn'
480
 
        if rcstype in ['svn', 'bzr-svn', 'hg', 'bzr']:
 
477
        if rcstype in ['svn', 'bzr-svn', 'hg']:
481
478
            assert cvs_root is cvs_module is None
482
479
            if url is None:
483
480
                url = self.getUniqueURL()
505
502
    for any other required objects.
506
503
    """
507
504
 
508
 
    def loginAsAnyone(self, participation=None):
 
505
    def loginAsAnyone(self):
509
506
        """Log in as an arbitrary person.
510
507
 
511
508
        If you want to log in as a celebrity, including admins, see
513
510
        """
514
511
        login(ANONYMOUS)
515
512
        person = self.makePerson()
516
 
        login_as(person, participation)
 
513
        login_as(person)
517
514
        return person
518
515
 
519
516
    @with_celebrity_logged_in('admin')
758
755
            address, person, email_status, account)
759
756
 
760
757
    def makeTeam(self, owner=None, displayname=None, email=None, name=None,
761
 
                 description=None,
762
758
                 subscription_policy=TeamSubscriptionPolicy.OPEN,
763
759
                 visibility=None, members=None):
764
760
        """Create and return a new, arbitrary Team.
768
764
        :type owner: `IPerson` or string
769
765
        :param displayname: The team's display name.  If not given we'll use
770
766
            the auto-generated name.
771
 
        :param description: Team team's description.
772
767
        :type string:
773
768
        :param email: The email address to use as the team's contact address.
774
769
        :type email: string
794
789
            displayname = SPACE.join(
795
790
                word.capitalize() for word in name.split('-'))
796
791
        team = getUtility(IPersonSet).newTeam(
797
 
            owner, name, displayname, teamdescription=description,
798
 
            subscriptionpolicy=subscription_policy)
 
792
            owner, name, displayname, subscriptionpolicy=subscription_policy)
799
793
        if visibility is not None:
800
794
            # Visibility is normally restricted to launchpad.Commercial, so
801
795
            # removing the security proxy as we don't care here.
1124
1118
            branch_type=branch_type, name=name, registrant=registrant,
1125
1119
            url=url, **optional_branch_args)
1126
1120
        if private:
1127
 
            removeSecurityProxy(branch).explicitly_private = True
1128
 
            removeSecurityProxy(branch).transitively_private = True
 
1121
            removeSecurityProxy(branch).private = True
1129
1122
        if stacked_on is not None:
1130
1123
            removeSecurityProxy(branch).stacked_on = stacked_on
1131
1124
        if reviewer is not None:
1433
1426
 
1434
1427
    def makeBranchMergeProposal(self, target_branch=None, registrant=None,
1435
1428
                                set_state=None, prerequisite_branch=None,
1436
 
                                product=None, initial_comment=None,
1437
 
                                source_branch=None, preview_diff=None,
1438
 
                                date_created=None, description=None,
1439
 
                                reviewer=None):
 
1429
                                product=None, review_diff=None,
 
1430
                                initial_comment=None, source_branch=None,
 
1431
                                preview_diff=None, date_created=None,
 
1432
                                description=None, reviewer=None):
1440
1433
        """Create a proposal to merge based on anonymous branches."""
1441
1434
        if target_branch is not None:
1442
1435
            target = target_branch.target
1466
1459
            review_requests.append((reviewer, None))
1467
1460
        proposal = source_branch.addLandingTarget(
1468
1461
            registrant, target_branch, review_requests=review_requests,
1469
 
            prerequisite_branch=prerequisite_branch, description=description,
1470
 
            date_created=date_created)
 
1462
            prerequisite_branch=prerequisite_branch, review_diff=review_diff,
 
1463
            description=description, date_created=date_created)
1471
1464
 
1472
1465
        unsafe_proposal = removeSecurityProxy(proposal)
1473
1466
        if preview_diff is not None:
1557
1550
        return merge_proposal.generateIncrementalDiff(
1558
1551
            old_revision, new_revision, diff)
1559
1552
 
 
1553
    def makeStaticDiff(self):
 
1554
        return StaticDiff.acquireFromText(
 
1555
            self.getUniqueUnicode(), self.getUniqueUnicode(),
 
1556
            self.getUniqueString())
 
1557
 
1560
1558
    def makeRevision(self, author=None, revision_date=None, parent_ids=None,
1561
1559
                     rev_id=None, log_body=None, date_created=None):
1562
1560
        """Create a single `Revision`."""
1628
1626
        return branch.createBranchRevision(sequence, revision)
1629
1627
 
1630
1628
    def makeBug(self, product=None, owner=None, bug_watch_url=None,
1631
 
                private=False, security_related=False, date_closed=None,
1632
 
                title=None, date_created=None, description=None, comment=None,
 
1629
                private=False, date_closed=None, title=None,
 
1630
                date_created=None, description=None, comment=None,
1633
1631
                status=None, distribution=None, milestone=None, series=None,
1634
1632
                tags=None, sourcepackagename=None):
1635
1633
        """Create and return a new, arbitrary Bug.
1680
1678
                sourcepackagename=sourcepackagename)
1681
1679
        create_bug_params = CreateBugParams(
1682
1680
            owner, title, comment=comment, private=private,
1683
 
            security_related=security_related,
1684
1681
            datecreated=date_created, description=description,
1685
1682
            status=status, tags=tags)
1686
1683
        create_bug_params.setBugTarget(
2126
2123
 
2127
2124
    def makeCodeImport(self, svn_branch_url=None, cvs_root=None,
2128
2125
                       cvs_module=None, target=None, branch_name=None,
2129
 
                       git_repo_url=None, hg_repo_url=None,
2130
 
                       bzr_branch_url=None, registrant=None,
 
2126
                       git_repo_url=None, hg_repo_url=None, registrant=None,
2131
2127
                       rcs_type=None, review_status=None):
2132
2128
        """Create and return a new, arbitrary code import.
2133
2129
 
2136
2132
        unique URL.
2137
2133
        """
2138
2134
        if (svn_branch_url is cvs_root is cvs_module is git_repo_url is
2139
 
            hg_repo_url is bzr_branch_url is None):
 
2135
            hg_repo_url is None):
2140
2136
            svn_branch_url = self.getUniqueURL()
2141
2137
 
2142
2138
        if target is None:
2153
2149
            else:
2154
2150
                assert rcs_type in (RevisionControlSystems.SVN,
2155
2151
                                    RevisionControlSystems.BZR_SVN)
2156
 
            return code_import_set.new(
 
2152
            code_import = code_import_set.new(
2157
2153
                registrant, target, branch_name, rcs_type=rcs_type,
2158
 
                url=svn_branch_url, review_status=review_status)
 
2154
                url=svn_branch_url)
2159
2155
        elif git_repo_url is not None:
2160
2156
            assert rcs_type in (None, RevisionControlSystems.GIT)
2161
 
            return code_import_set.new(
 
2157
            code_import = code_import_set.new(
2162
2158
                registrant, target, branch_name,
2163
2159
                rcs_type=RevisionControlSystems.GIT,
2164
 
                url=git_repo_url, review_status=review_status)
 
2160
                url=git_repo_url)
2165
2161
        elif hg_repo_url is not None:
2166
 
            return code_import_set.new(
 
2162
            code_import = code_import_set.new(
2167
2163
                registrant, target, branch_name,
2168
2164
                rcs_type=RevisionControlSystems.HG,
2169
 
                url=hg_repo_url, review_status=review_status)
2170
 
        elif bzr_branch_url is not None:
2171
 
            return code_import_set.new(
2172
 
                registrant, target, branch_name,
2173
 
                rcs_type=RevisionControlSystems.BZR,
2174
 
                url=bzr_branch_url, review_status=review_status)
 
2165
                url=hg_repo_url)
2175
2166
        else:
2176
2167
            assert rcs_type in (None, RevisionControlSystems.CVS)
2177
 
            return code_import_set.new(
 
2168
            code_import = code_import_set.new(
2178
2169
                registrant, target, branch_name,
2179
2170
                rcs_type=RevisionControlSystems.CVS,
2180
 
                cvs_root=cvs_root, cvs_module=cvs_module,
2181
 
                review_status=review_status)
 
2171
                cvs_root=cvs_root, cvs_module=cvs_module)
 
2172
        if review_status:
 
2173
            removeSecurityProxy(code_import).review_status = review_status
 
2174
        return code_import
2182
2175
 
2183
2176
    def makeChangelog(self, spn=None, versions=[]):
2184
 
        """Create and return a LFA of a valid Debian-style changelog.
2185
 
 
2186
 
        Note that the changelog returned is unicode - this is deliberate
2187
 
        so that code is forced to cope with it as utf-8 changelogs are
2188
 
        normal.
2189
 
        """
 
2177
        """Create and return a LFA of a valid Debian-style changelog."""
2190
2178
        if spn is None:
2191
2179
            spn = self.getUniqueString()
2192
2180
        changelog = ''
2193
2181
        for version in versions:
2194
 
            entry = dedent(u'''\
 
2182
            entry = dedent('''
2195
2183
            %s (%s) unstable; urgency=low
2196
2184
 
2197
2185
              * %s.
2198
2186
 
2199
 
             -- Føo Bær <foo@example.com>  Tue, 01 Jan 1970 01:50:41 +0000
 
2187
             -- Foo Bar <foo@example.com>  Tue, 01 Jan 1970 01:50:41 +0000
2200
2188
 
2201
2189
            ''' % (spn, version, version))
2202
2190
            changelog += entry
2203
 
        return self.makeLibraryFileAlias(content=changelog.encode("utf-8"))
 
2191
        return self.makeLibraryFileAlias(content=changelog)
2204
2192
 
2205
2193
    def makeCodeImportEvent(self):
2206
2194
        """Create and return a CodeImportEvent."""
2287
2275
        return bmp.nominateReviewer(candidate, bmp.registrant)
2288
2276
 
2289
2277
    def makeMessage(self, subject=None, content=None, parent=None,
2290
 
                    owner=None, datecreated=None):
 
2278
                    owner=None):
2291
2279
        if subject is None:
2292
2280
            subject = self.getUniqueString()
2293
2281
        if content is None:
2294
2282
            content = self.getUniqueString()
2295
2283
        if owner is None:
2296
2284
            owner = self.makePerson()
2297
 
        if datecreated is None:
2298
 
            datecreated = datetime.now(UTC)
2299
2285
        rfc822msgid = self.makeUniqueRFC822MsgId()
2300
2286
        message = Message(rfc822msgid=rfc822msgid, subject=subject,
2301
 
            owner=owner, parent=parent, datecreated=datecreated)
 
2287
            owner=owner, parent=parent)
2302
2288
        MessageChunk(message=message, sequence=1, content=content)
2303
2289
        return message
2304
2290
 
2347
2333
                         aliases=None, bug_supervisor=None, driver=None,
2348
2334
                         security_contact=None, publish_root_dir=None,
2349
2335
                         publish_base_url=None, publish_copy_base_url=None,
2350
 
                         no_pubconf=False, icon=None, summary=None):
 
2336
                         no_pubconf=False, icon=None):
2351
2337
        """Make a new distribution."""
2352
2338
        if name is None:
2353
2339
            name = self.getUniqueString(prefix="distribution")
2356
2342
        if title is None:
2357
2343
            title = self.getUniqueString()
2358
2344
        description = self.getUniqueString()
2359
 
        if summary is None:
2360
 
            summary = self.getUniqueString()
 
2345
        summary = self.getUniqueString()
2361
2346
        domainname = self.getUniqueString()
2362
2347
        if registrant is None:
2363
2348
            registrant = self.makePerson()
2955
2940
    def makePOTemplate(self, productseries=None, distroseries=None,
2956
2941
                       sourcepackagename=None, owner=None, name=None,
2957
2942
                       translation_domain=None, path=None,
2958
 
                       copy_pofiles=True, side=None, sourcepackage=None,
2959
 
                       iscurrent=True):
 
2943
                       copy_pofiles=True, side=None, sourcepackage=None):
2960
2944
        """Make a new translation template."""
2961
2945
        if sourcepackage is not None:
2962
2946
            assert distroseries is None, (
2997
2981
        if path is None:
2998
2982
            path = 'messages.pot'
2999
2983
 
3000
 
        pot = subset.new(name, translation_domain, path, owner, copy_pofiles)
3001
 
        removeSecurityProxy(pot).iscurrent = iscurrent
3002
 
        return pot
 
2984
        return subset.new(name, translation_domain, path, owner, copy_pofiles)
3003
2985
 
3004
2986
    def makePOTemplateAndPOFiles(self, language_codes, **kwargs):
3005
2987
        """Create a POTemplate and associated POFiles.
3247
3229
 
3248
3230
        if content is None:
3249
3231
            content = self.getUniqueString()
 
3232
        content_reference = getUtility(ILibraryFileAliasSet).create(
 
3233
            name=os.path.basename(path), size=len(content),
 
3234
            file=StringIO(content), contentType='text/plain')
3250
3235
 
3251
3236
        if format is None:
3252
3237
            format = TranslationFileFormat.PO
3254
3239
        if status is None:
3255
3240
            status = RosettaImportStatus.NEEDS_REVIEW
3256
3241
 
3257
 
        if type(content) == unicode:
3258
 
            content = content.encode('utf-8')
3259
 
 
3260
 
        entry = getUtility(ITranslationImportQueue).addOrUpdateEntry(
3261
 
            path=path, content=content, by_maintainer=by_maintainer,
3262
 
            importer=uploader, productseries=productseries,
3263
 
            distroseries=distroseries, sourcepackagename=sourcepackagename,
3264
 
            potemplate=potemplate, pofile=pofile, format=format)
3265
 
        entry.setStatus(
3266
 
            status, getUtility(ILaunchpadCelebrities).rosetta_experts)
3267
 
        return entry
 
3242
        return TranslationImportQueueEntry(
 
3243
            path=path, productseries=productseries, distroseries=distroseries,
 
3244
            sourcepackagename=sourcepackagename, importer=uploader,
 
3245
            content=content_reference, status=status, format=format,
 
3246
            by_maintainer=by_maintainer)
3268
3247
 
3269
3248
    def makeMailingList(self, team, owner):
3270
3249
        """Create a mailing list for the team."""
3393
3372
            return self.makeSourcePackageName()
3394
3373
        return getUtility(ISourcePackageNameSet).getOrCreateByName(name)
3395
3374
 
3396
 
    def makeSourcePackage(self, sourcepackagename=None, distroseries=None,
3397
 
                          publish=False):
3398
 
        """Make an `ISourcePackage`.
3399
 
 
3400
 
        :param publish: if true, create a corresponding
3401
 
            SourcePackagePublishingHistory.
3402
 
        """
 
3375
    def makeSourcePackage(self, sourcepackagename=None, distroseries=None):
 
3376
        """Make an `ISourcePackage`."""
3403
3377
        # Make sure we have a real sourcepackagename object.
3404
3378
        if (sourcepackagename is None or
3405
3379
            isinstance(sourcepackagename, basestring)):
3407
3381
                sourcepackagename)
3408
3382
        if distroseries is None:
3409
3383
            distroseries = self.makeDistroSeries()
3410
 
        if publish:
3411
 
            self.makeSourcePackagePublishingHistory(
3412
 
                distroseries=distroseries,
3413
 
                sourcepackagename=sourcepackagename)
3414
3384
        return distroseries.getSourcePackage(sourcepackagename)
3415
3385
 
3416
3386
    def getAnySourcePackageUrgency(self):
3436
3406
            pocket, archive, changes_filename, changes_file_content,
3437
3407
            signing_key=signing_key, package_copy_job=package_copy_job)
3438
3408
        if status is not None:
3439
 
            if status is not PackageUploadStatus.NEW:
3440
 
                naked_package_upload = removeSecurityProxy(package_upload)
3441
 
                status_changers = {
3442
 
                    PackageUploadStatus.UNAPPROVED:
3443
 
                        naked_package_upload.setUnapproved,
3444
 
                    PackageUploadStatus.REJECTED:
3445
 
                        naked_package_upload.setRejected,
3446
 
                    PackageUploadStatus.DONE: naked_package_upload.setDone,
3447
 
                    PackageUploadStatus.ACCEPTED:
3448
 
                        naked_package_upload.setAccepted,
3449
 
                    }
3450
 
                status_changers[status]()
 
3409
            naked_package_upload = removeSecurityProxy(package_upload)
 
3410
            status_changers = {
 
3411
                PackageUploadStatus.DONE: naked_package_upload.setDone,
 
3412
                PackageUploadStatus.ACCEPTED:
 
3413
                    naked_package_upload.setAccepted,
 
3414
                }
 
3415
            status_changers[status]()
3451
3416
        return package_upload
3452
3417
 
3453
3418
    def makeSourcePackageUpload(self, distroseries=None,
3693
3658
                                           date_uploaded=UTC_NOW,
3694
3659
                                           scheduleddeletiondate=None,
3695
3660
                                           ancestor=None,
3696
 
                                           **kwargs):
 
3661
                                           **kwargs
 
3662
                                           ):
3697
3663
        """Make a `SourcePackagePublishingHistory`.
3698
3664
 
3699
3665
        :param sourcepackagerelease: The source package release to publish
3819
3785
            naked_bpph.datepublished = UTC_NOW
3820
3786
        return bpph
3821
3787
 
3822
 
    def makeSPPHForBPPH(self, bpph):
3823
 
        """Produce a `SourcePackagePublishingHistory` to match `bpph`.
3824
 
 
3825
 
        :param bpph: A `BinaryPackagePublishingHistory`.
3826
 
        :return: A `SourcePackagePublishingHistory` stemming from the same
3827
 
            source package as `bpph`, published into the same distroseries,
3828
 
            pocket, and archive.
3829
 
        """
3830
 
        # JeroenVermeulen 2011-08-25, bug=834370: Julian says this isn't
3831
 
        # very complete, and ignores architectures.  Improve so we can
3832
 
        # remove more of our reliance on the SoyuzTestPublisher.
3833
 
        bpr = bpph.binarypackagerelease
3834
 
        spph = self.makeSourcePackagePublishingHistory(
3835
 
            distroseries=bpph.distroarchseries.distroseries,
3836
 
            sourcepackagerelease=bpr.build.source_package_release,
3837
 
            pocket=bpph.pocket, archive=bpph.archive)
3838
 
        return spph
3839
 
 
3840
3788
    def makeBinaryPackageName(self, name=None):
3841
3789
        """Make an `IBinaryPackageName`."""
3842
3790
        if name is None:
4097
4045
                         emailaddress=u'test@canonical.com',
4098
4046
                         distroarchseries=None, private=False,
4099
4047
                         contactable=False, system=None,
4100
 
                         submission_data=None, status=None):
 
4048
                         submission_data=None):
4101
4049
        """Create a new HWSubmission."""
4102
4050
        if date_created is None:
4103
4051
            date_created = datetime.now(pytz.UTC)
4118
4066
        format = HWSubmissionFormat.VERSION_1
4119
4067
        submission_set = getUtility(IHWSubmissionSet)
4120
4068
 
4121
 
        submission = submission_set.createSubmission(
 
4069
        return submission_set.createSubmission(
4122
4070
            date_created, format, private, contactable,
4123
4071
            submission_key, emailaddress, distroarchseries,
4124
4072
            raw_submission, filename, filesize, system)
4125
4073
 
4126
 
        if status is not None:
4127
 
            removeSecurityProxy(submission).status = status
4128
 
        return submission
4129
 
 
4130
4074
    def makeHWSubmissionDevice(self, submission, device, driver, parent,
4131
4075
                               hal_device_id):
4132
4076
        """Create a new HWSubmissionDevice."""