~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/bugs/browser/bugtracker.py

[r=benji][bug=795573,
 796233] On DistroSeries:+localpackagediffs ensure that the comment
 form is hidden after adding a new comment to a DistroSeriesDifference,
 prevent empty comments from being submitted,
 and add some animations and effects to make the UI less jarring and easier to
 follow.

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
    'BugTrackerBreadcrumb',
11
11
    'BugTrackerComponentGroupNavigation',
12
12
    'BugTrackerEditView',
 
13
    'BugTrackerEditComponentView',
13
14
    'BugTrackerNavigation',
14
15
    'BugTrackerNavigationMenu',
15
16
    'BugTrackerSetBreadcrumb',
65
66
from lp.app.interfaces.launchpad import ILaunchpadCelebrities
66
67
from lp.app.widgets.itemswidgets import LaunchpadRadioWidget
67
68
from lp.app.widgets.textwidgets import DelimitedListWidget
 
69
from lp.bugs.browser.widgets.bugtask import (
 
70
    UbuntuSourcePackageNameWidget,
 
71
    )
68
72
from lp.bugs.interfaces.bugtracker import (
69
73
    BugTrackerType,
70
74
    IBugTracker,
 
75
    IBugTrackerComponent,
71
76
    IBugTrackerComponentGroup,
72
77
    IBugTrackerSet,
73
78
    IRemoteBug,
227
232
        return shortlist(chain(self.context.projects,
228
233
                               self.context.products), 100)
229
234
 
 
235
    @property
 
236
    def related_component_groups(self):
 
237
        """All component groups and components."""
 
238
        return self.context.getAllRemoteComponentGroups()
 
239
 
230
240
 
231
241
BUG_TRACKER_ACTIVE_VOCABULARY = SimpleVocabulary.fromItems(
232
242
    [('On', True), ('Off', False)])
445
455
            return RemoteBug(self.context, remotebug, bugs)
446
456
 
447
457
    @stepthrough("+components")
448
 
    def component_groups(self, name):
449
 
        return self.context.getRemoteComponentGroup(name)
 
458
    def component_groups(self, id):
 
459
        # Navigate by id (component group name should work too)
 
460
        return self.context.getRemoteComponentGroup(id)
 
461
 
 
462
 
 
463
class BugTrackerEditComponentView(LaunchpadEditFormView):
 
464
    """Provides editing form for setting source packages for components.
 
465
 
 
466
    In this class we assume that bug tracker components are always
 
467
    linked to source packages in the Ubuntu distribution.
 
468
    """
 
469
    schema = IBugTrackerComponent
 
470
    custom_widget('sourcepackagename', UbuntuSourcePackageNameWidget)
 
471
    field_names = ['sourcepackagename']
 
472
    page_title = 'Link component'
 
473
 
 
474
    @property
 
475
    def label(self):
 
476
        return (
 
477
            'Link a distribution source package to %s component' %
 
478
            self.context.name)
 
479
 
 
480
    @property
 
481
    def initial_values(self):
 
482
        """See `LaunchpadFormView.`"""
 
483
        field_values = dict(sourcepackagename='')
 
484
        dsp = self.context.distro_source_package
 
485
        if dsp is not None:
 
486
            field_values['sourcepackagename'] = dsp.name
 
487
        return field_values
 
488
 
 
489
    @property
 
490
    def next_url(self):
 
491
        return canonical_url(self.context.component_group.bug_tracker)
 
492
 
 
493
    cancel_url = next_url
 
494
 
 
495
    def updateContextFromData(self, data, context=None):
 
496
        """Link component to specified distro source package.
 
497
 
 
498
        Get the user-provided source package name from the form widget,
 
499
        look it up in Ubuntu to retrieve the distro_source_package
 
500
        object, and link it to this component.
 
501
        """
 
502
        sourcepackagename = data['sourcepackagename']
 
503
        distribution = self.widgets['sourcepackagename'].getDistribution()
 
504
        dsp = distribution.getSourcePackage(sourcepackagename)
 
505
        bug_tracker = self.context.component_group.bug_tracker
 
506
        # Has this source package already been assigned to a component?
 
507
        component = bug_tracker.getRemoteComponentForDistroSourcePackageName(
 
508
            distribution, sourcepackagename)
 
509
        if component is not None:
 
510
            self.request.response.addNotification(
 
511
                "The %s source package is already linked to %s:%s in %s." % (
 
512
                    sourcepackagename.name,
 
513
                    component.component_group.name,
 
514
                    component.name, distribution.name))
 
515
            return
 
516
        # The submitted component can be linked to the distro source package.
 
517
        component = context or self.context
 
518
        component.distro_source_package = dsp
 
519
        if sourcepackagename is None:
 
520
            self.request.response.addNotification(
 
521
                "%s:%s is now unlinked." % (
 
522
                    component.component_group.name, component.name))
 
523
        else:
 
524
            self.request.response.addNotification(
 
525
                "%s:%s is now linked to the %s source package in %s." % (
 
526
                    component.component_group.name, component.name,
 
527
                    sourcepackagename.name, distribution.name))
 
528
 
 
529
    @action('Save Changes', name='save')
 
530
    def save_action(self, action, data):
 
531
        """Update the component with the form data."""
 
532
        self.updateContextFromData(data)
450
533
 
451
534
 
452
535
class BugTrackerComponentGroupNavigation(Navigation):
453
536
 
454
537
    usedfor = IBugTrackerComponentGroup
455
538
 
456
 
    def traverse(self, name):
457
 
        return self.context.getComponent(name)
 
539
    def traverse(self, id):
 
540
        return self.context.getComponent(id)
458
541
 
459
542
 
460
543
class BugTrackerSetBreadcrumb(Breadcrumb):