def main(argv=None): global r if argv is None: argv = sys.argv parser = argparse.ArgumentParser( description=__description__,formatter_class=RawTextHelpFormatter) parser.add_argument('url',metavar='URL',help="redmine url (excluding http)") parser.add_argument('api_key',metavar='KEY',help="user api key") parser.add_argument('--filename',metavar='FILE',default='tasks.csv',help="name of the csv file to sync") try: args = parser.parse_args() except: sys.exit(1) filename=args.filename url=args.url api_key=args.api_key r = Redmine(url,api_key) data=read_data(filename) newdata=[] id_hash={} for i in data: project_id=find_project_id(i['project']) assigned_to_id=find_user_id(i['assigned_to']) status_id=find_status_id(i['status']) tracker_id=find_tracker_id(i['tracker']) logger.debug("%(project_id)s,%(assigned_to_id)s,%(status_id)s,%(tracker_id)s" % locals()) if i['id'][-1].upper()=='D': i['id']=i['id'][0:-1] r.Issue().delete(i['id']) logger.info('Deleted %s %s' % (i['id'],i['subject'])) elif i['id'][-1].upper()=='E' or i['id'].upper()=='A': i_id=i['id'][0:-1] if project_id and tracker_id and status_id and assigned_to_id: if i['id']=='A': ni=r.Issue()() action = "Added" else: action ="Updated" ni = r.Issue().find(i_id) ni.subject=i['subject'] ni.tracker_id=tracker_id ni.project_id=project_id ni.assigned_to_id=assigned_to_id ni.status_id = status_id ni.priority_id = i['priority'] ni.save() newdata.append({ 'id':ni.id, 'subject':ni.subject, 'project': r.Project().find(ni.project.id).identifier, 'assigned_to': find_user_or_group_login(ni.assigned_to_id), 'status': i['status'], 'tracker': ni.tracker.name, 'priority': i['priority'], 'last_sync': date.today() }) id_hash[ni.id]=True logger.info('%s %s,%s' % (action,ni.id,ni.subject)) else: i['last_sync']=None newdata.append(i) logger.warning('Data error with record %s,%s' % (i['id'],i['subject'])) issues=r.Issue().find() for ni in issues: try: i_id=id_hash[ni.id] except: try: assigned_to = find_user_or_group_login(ni.assigned_to.id) except: assigned_to = None newdata.append({ 'id':ni.id, 'subject':ni.subject, 'project': r.Project().find(ni.project.id).identifier, 'assigned_to': assigned_to, 'status': ni.status.name, 'tracker': ni.tracker.name, 'priority': ni.priority.id, 'last_sync': date.today(), }) action='Syncing' logger.info('%s %s,%s' % (action,ni.id,ni.subject)) write_data(filename,newdata)