~ossug-hychen/lp-cli/trunk

« back to all changes in this revision

Viewing changes to mazo/extensions/lp_cli/__init__.py

  • Committer: Hsin-Yi Chen (hychen)
  • Date: 2012-07-16 06:00:52 UTC
  • mfrom: (76.1.16 develop)
  • Revision ID: hychen@canonical.com-20120716060052-zjy8tix737i6civo
[Feature] add 2 new commands

- lp-grabbugattachments : downalod bug attachments
- lp-dupbugtasks        : duplicate bug tasks

[Fix]

- exit if collected data is empty
- syntax error raised when a bug does not have any attachement or Launchpad response

Show diffs side-by-side

added added

removed removed

Lines of Context:
141
141
        self.add_argument('--search-text', dest='search_text',
142
142
                                help='search text')
143
143
        self.add_argument('--milestone', dest='milestone', help='milestone name')
 
144
        self.add_argument('--package', dest='package', help='source package name (only for project)', action='append')
 
145
 
 
146
    def do_prejob(self):
 
147
        if self.cmd_args.package and self.cmd_args.entry_type != 'project':
 
148
            self.logger.error("package option is only for project entry")
144
149
 
145
150
    def maintask(self, args):
146
151
        entry = self.get_lp_entry(args.entry_type, args.entry_id)
147
 
        kwargs = self.transform_args(args, ('entry_id', 'entry_type'))
 
152
        kwargs = self.transform_args(args, ('entry_id', 'entry_type', 'package'))
148
153
        if kwargs.get('assignee'):
149
154
            kwargs['assignee'] = self.lp.people[kwargs['assignee']]
150
155
        if kwargs.get('milestone'):
151
156
            kwargs['milestone'] = entry.getMilestone(name=kwargs['milestone'])
152
 
        return entry.searchTasks(**kwargs)
153
 
 
 
157
 
 
158
        if args.package and args.entry_type == 'project':
 
159
            ret = []
 
160
            for pkgname in args.package:
 
161
                srcpkg = entry.getSourcePackage(name=pkgname)
 
162
                ret.extend([e for e in srcpkg.searchTasks(**kwargs)])
 
163
            return ret
 
164
        else:
 
165
            return entry.searchTasks(**kwargs)
 
166
 
 
167
 
 
168
# userEditSTring and EditableData codes is wrote by  James Ferguson <james.ferguson@canonical.com>, modified by hychen
154
169
def userEditString(suffix = '',
155
170
                   startingString = "",
156
171
                   filenamePrefix='enter-comment-if-reqd.'):
382
397
        self.add_argument('--remove-tag', dest='remove_tag', action='append')
383
398
 
384
399
    def do_postjob(self):
385
 
        if not self.result:
386
 
            print "No Result!"
387
 
            exit()
388
400
        prj = [self.get_lp_entry('project', prj_name) \
389
401
                for prj_name in self.cmd_args.project]
390
402
        self.target_project = prj[0]
517
529
    def _ask_confirmation(self, msg):
518
530
        if self.dlg.yesno(msg, 10, 74, defaultno=True) != 0:
519
531
                        exit()
 
532
 
 
533
def download_bug_attachments(bug, output_dir):
 
534
    # write title and desc
 
535
    with open(os.path.join(output_dir, bug.title.encode('utf-8')), 'w') as descfd:
 
536
            descfd.write(bug.description)
 
537
    for attachment in bug.attachments:
 
538
        filename = os.path.join(output_dir, attachment.title)
 
539
        try:
 
540
            data = attachment.data.open()
 
541
            with open(filename, 'w') as f:
 
542
                f.write(data.read())
 
543
            data.close()
 
544
        except Exception, e:
 
545
            logging.debug(e)
 
546
            logging.error(
 
547
                    "Unable to download file {0}".format(attachment.title))
 
548
 
 
549
class ExtensionGrabbugattachments(object):
 
550
    __metaclass__ = ExtensionType
 
551
    responsible_for = DoLPQueryJob
 
552
    interface = Command
 
553
 
 
554
    def custom_arguments(self):
 
555
        self.add_argument('--output-dir', default=os.getcwd())
 
556
 
 
557
    def do_postjob(self):
 
558
        self.output_dir = self.cmd_args.output_dir
 
559
        #@FIXME:
 
560
        if type(self.result).__name__ != 'generator':
 
561
            bugs = [bt.bug for bt in self.result]
 
562
        else:
 
563
            bugs = self.result
 
564
 
 
565
        # create sub directory
 
566
        for bug in bugs:
 
567
            subdir_name = os.path.join(self.output_dir, str(bug.id))
 
568
            if not os.path.isdir(subdir_name):
 
569
                os.mkdir(subdir_name)
 
570
            # grab attachments
 
571
            self.logger.info(
 
572
                "Downloading attachments of the bug {0}".format(
 
573
                                                    bug.id))
 
574
            download_bug_attachments(bug, subdir_name)
 
575
        self.logger.info("Done!")