2010-11-12 3 views
1

Je dois extraire des données de l'API. Il renvoie le GET en XML et j'ai quelques problèmes à essayer de comprendre comment assigner certaines des données de l'API aux champs de mon modèle dans django/python.Affectation de variables à partir d'un code XML renvoyé à partir d'un appel API

L'API pour activeCollab ne me permet pas de créer mon propre numéro de projet, il génère automatiquement le numéro pour moi. Je voudrais donc prendre ce nombre, puis l'affecter à mon champ API_id dans mon modèle de projet. Quelqu'un pourrait-il m'aider à comprendre comment prendre le XML que le GET retourne et l'assigner à l'un de mes champs.

API ActiveCollab Documentation pour les projets: http://www.activecollab.com/docs/manuals/developers/api/projects

Voici mon models.py

class Project(models.Model): 
client = models.ForeignKey(Clients, related_name='projects') 
created_by = models.ForeignKey(User, related_name='created_by') 


#general information 
API_id = models.IntegerField(max_length=10, verbose_name='aC ProjectID', null=True, blank=True) 
proj_name = models.CharField(max_length=255, verbose_name='Project Name') 
pre_quote = models.CharField(max_length=3) 
quote = models.IntegerField(max_length=10, verbose_name='Quote #', unique=True) 
estimator = models.ForeignKey(User, related_name='Estimator', null=True) 
desc = models.TextField(verbose_name='Description', null=True, blank=True) 
starts_on = models.DateField(verbose_name='Start Date') 
due_date = models.DateField(verbose_name='Due Date', null=True, blank=True) 
completed_on = models.DateField(verbose_name='Finished On', null=True, blank=True) 
notes = models.TextField(verbose_name='Notes', null=True, blank=True) 

views.py

def addProject(request): 
if request.method == 'POST': 
    form = AddSingleProjectForm(request.POST) 
    if form.is_valid(): 
     project = form.save(commit=False) 
     project.created_by = request.user 
     today = datetime.date.today() 
     project.pre_quote = "%s-" % (str(today.year)[2:4]) 
     project.quote = Project.objects.latest().quote+1 
     project.save() 

     project.status.create(
       value = form.cleaned_data.get('status', None) 
     )    

     #API activeCollab 
     params = urllib.urlencode({ 
       'format':'xml', 
       'submitted':'submitted', 
       'project[name]': project.proj_name, 
       'project[overview]': project.desc, 
       'project[starts_on]': project.starts_on, 
       'project[leader_id]': 10, 
     }) 
     req = urllib2.Request("web_url/public/api.php?path_info=/projects/add&token=####################", params) 
     f = urllib2.urlopen(req) 
     print f.read() 


     return HttpResponseRedirect('/project/') 
else: 
    form = AddSingleProjectForm() 

return render_to_response('project/addProject.html', { 
'form': form, 'user':request.user}, context_instance=RequestContext(request)) 

Toutes les suggestions seront appréciées.

Steve

Ps. L'appel api que je l'ai montré est de créer un nouveau projet

+0

Quel est exactement votre problème? Vous semblez être assez heureux en soumettant la demande et en renvoyant le XML. Avec quel problème avez-vous des problèmes? –

+0

Cette partie fonctionne, mais le fait est que les ID de projet sont différents. L'ID dans activeCollab n'est pas le même que l'ID dans mon projet django. Ainsi, je n'arrive pas à comprendre comment faire un appel d'édition ou supprimer un appel parce que les ID ne sont pas les mêmes. – TheLifeOfSteve

Répondre

1

Après avoir examiné le lien que vous avez posté ... quelque chose comme ça pourrait vous aider à démarrer, en utilisant lxml et xpath:

>>> from lxml import etree 
>>> doc = etree.XML("""<projects> 
... <project> 
...  <id>1</id> 
...  <name> 
...  <![CDATA[First Project]]> 
...  </name> 
...  <overview> 
...  <![CDATA[<p>This is overview of the first project</p>]]> 
...  </overview> 
...  <status> 
...  <![CDATA[active]]> 
...  </status> 
...  <type>...</type> 
...  <permalink>...</permalink> 
...  <leader_id>...</leader_id> 
...  <company_id>...</company_id> 
...  <group_id>...</group_id> 
... </project> 
... </projects>""") 
>>> data = {} 
>>> for a in doc.xpath('/projects/project/*'): 
... data[a.tag] = str(a.text).strip() 
... 
>>> data 
{'company_id': '...', 
'group_id': '...', 
'id': '1', 
'leader_id': '...', 
'name': 'First Project', 
'overview': '<p>This is overview of the first project</p>', 
'permalink': '...', 
'status': 'active', 
'type': '...'} 

Mise à jour

aide un peu plus explicite:

En supposant que vous avez un from lxml import etree dans votre fichier. voici un extrait pour votre addProject fonction:

req = urllib2.Request("web_url/public/api.php?path_info=/projects/add&token=####################", params) 
resp = urllib2.urlopen(req) 
resp_data = f.read() 
if not resp.code == 200 and resp.headers.get('content-type') == 'text/xml': 
    # Do your error handling. 
    raise Exception('Unexpected response',req,resp) 
data = etree.XML(resp_data) 
api_id = int(data.xpath('/project/id/text()')[0]) 
project.API_id = api_id 
project.save() 
+0

merci beaucoup MattH! – TheLifeOfSteve

+0

Hey MattH J'ai quelques problèmes pour installer lxml, seriez-vous en mesure d'offrir de l'aide sur ce problème? – TheLifeOfSteve

+0

Quel est le problème? – MattH

Questions connexes