Trac Plugin Entwicklung - Datei schreiben/ ändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

Hallo,

ich entwickle gerade ein Plugin für Trac und habe nun folgendes Problem:
Mein Plugin beinhaltet einen Ordner data in dem .json Dateien abgespeichert sind. Das Plugin erzeugt später HTML Code (inklusive Java-Skripte). Dieser Code greift auf diese .json Dateien zu. Soweit funktioniert auch alles.
Nun sollen diese Dateien aber zur Laufzeit angepasst werden. Nun weiß ich aber nicht genau mit welchem Pfad ich diese Dateien ansprechen kann (wenn ich es anspreche wie im HTML Code gibt es eine Fehlermeldung: "there is no such file or directory"). Aus Testzwecken habe ich auch einfach mal nur

Code: Alles auswählen

jsonData = open("test.json", "w")
gemacht was aber zu einem "Permission Denied" Fehler führt. Also gehe ich außerdem davon aus, dass selbst wenn ich weiß wie ich die Datei richtig anspreche diesen Fehler erhalten werde.

Also sind meine Fragen:
1. Wie spreche ich die Datei an, die in meinem Plugin unter data abgelegt ist?
2. Wie bekomme ich die nötigen Rechte um die Datei zu erstellen/ verändern? Oder ist es gar nicht möglich?

Kann mir jemand mit wenigstens einer Frage weiterhelfen? Ich versuche schon seit Stunden das Problem zu lösen und komme keinen Schritt weiter.

Vielen Dank und viele Grüße
Micha
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

Kann mir keiner weiterhelfen?

Grüße
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Permission Denied sagt nur das du keinen Zugriff auf die Datei hast.

Prüfe einfach mal ob du schreibrechte auf die Datei hast.
Und prüfe ob du nicht irgendwo ein noch offenes Filehandle auf die Datei hast, was bei

Code: Alles auswählen

jsonData = open("test.json", "w")
durchaus passieren kann wenn du die Anweisung weiter oben stehen hast und das handle nicht schließt.

Bei sowas bitte mit

Code: Alles auswählen

with open("test.json", "w") as jsonData:
öffnen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

Vielen Dank fürs Helfen.
Ja mein Problem ist, dass ich nicht über die benötigten Rechte verfüge.
Gibt es eine Möglichkeit diese, mittels Code, zu bekommen? Ein Problem ist, dass dieses Trac-Plugin auch auf anderen Computern installiert werden soll. Nun scheint es aber so zu sein, dass man erst einmal nach der Installation keine Rechte auf die neu angelegten Ordner hat.

Grüße

Edit: Den Code habe ich nach deinem Vorschlag verändert, bekomme aber die gleichen Fehler
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Um das über den Script zusetzen, fällt mir spontan nur os.system("chmod") ein.
Aber dies ist nun nicht wirklich angebracht,
1. Funktioniert nur in Linux-Distribution
2. os.system ist veraltet, warscheinlich geht das auch mit subprocess.popen(...)
3. Würde das nur mit root-Rechten gehen.

in sofern fällt mir da nichts ein.
mic hat geschrieben:Den Code habe ich nach deinem Vorschlag verändert, bekomme aber die gleichen Fehler
Logisch wenn du immer noch keine Schreibrechte hast.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

Ich versuche das Ganze, da ich unter anderem diesen HTML Code erzeuge:

Code: Alles auswählen

<script type="text/javascript" src="%(PathToChrome)shw/js/swfobject.js"></script>

	<script type="text/javascript">

		swfobject.embedSWF(

			"%(PathToChrome)shw/swf/open-flash-chart.swf", "chart_bar_2", "780", "300",

			"9.0.0", "expressInstall.swf",

			{"data-file":"%(PathToChrome)shw/data/bar_2.json"}

		);

</script>
In der drittletzten Zeile steht die json Datei bar_2 die verändert werden sollte, was so aber offensichtlich sehr schwer umzusetzen ist.

Gibt es möglicherweise eine Möglichkeit an dieser Stelle direkt einen String oder sonstiges zu übergeben? Also wie

Code: Alles auswählen

{"data-file":"Input den ich oben sowieso per open("bar_2.json", "w") in die Datei geschrieben hätte"}
Alle meine Versuche in diese Richtung sind leider ebenfalls gescheitert.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

Ich stehe ein wenig auf dem Schlauch, ich weiß nicht genau was ich davon jetzt anwenden soll?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Mir ging es um String-Vearbeitung.

Gehen solche Sachen wie

Code: Alles auswählen

print("{0} text text text {1} text text ".format(var1,var2))
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

Also ich glaube wir reden möglicherweise gerade ein wenig aneinander vorbei.
Mein Problem ist, dass im HTML Code hier

Code: Alles auswählen

{"data-file":"%(PathToChrome)shw/data/bar_2.json"}
der Pfad zu meiner Datengrundlage angegeben ist.
Diese Datengrundlage möchte ich zur Laufzeit anpassen.
-->Die Datei ändern scheint nicht in Frage zu kommen
-->Frage: Gibt es eine Möglichkeit anstelle des Pfades direkt den Inhalt der Datei anzugeben?
-->Frage: Gibt es vielleicht einen anderen Workaround?

Gut möglich, dass mir dein Hinweis doch mit diesem Problem helfen kann, aber ich sehe gerade nicht wie...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Xynon1 hat geschrieben:Um das über den Script zusetzen, fällt mir spontan nur os.system("chmod") ein.
Aber dies ist nun nicht wirklich angebracht,
1. Funktioniert nur in Linux-Distribution
2. os.system ist veraltet, warscheinlich geht das auch mit subprocess.popen(...)
3. Würde das nur mit root-Rechten gehen.

in sofern fällt mir da nichts ein.
Es gibt os.chmod
Das man dafuer die noetigen Rechte wiederum braucht ist allerdings wieder klar (muessen aber nicht root-Rechte sein)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Mh, ok
{0}.. - bei dieser Methode musst du natürlich den Text ändern

einbetten des html textes möglich ?

Ansonsten per regularexpressions, oder direkt über eine replace Funktion den Text ändern.

@cofi
und wieder bin ich dir zu dank verpflichtet :D
glatt Übersehen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@mic: Du müsstest da halt keine URL auf eine feste Datei angeben, sondern eine deren Inhalt Du ebenfalls dynamisch generierst. Das mit einer "festen" Datei fällt doch sowieso auf die Nase wenn das mal zwei Leute gleichzeitig anfordern.
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

@cofi: Okay vielen Dank das schaue ich mir gleich einmal genauer an

@Xynon1: Also ich hätte wohl noch etwas genauer spezifizieren sollen. Mein Plugin funktioniert so, dass wenn in Trac zB eine Wiki Page vom Administrator angelegt wird, dieser per Macro das Plugin aufrufen kann. Mein Plugin verarbeitet nun die Eingaben des Administrators und gibt entsprechend HTML Code zurück (also ein Flash Chart). (Folgendes Plugin ist recht ähnlich gibt aber einfach ein statisches Bild zurück anstelle meines HTML Codes/ Flash Charts: http://trac-hacks.org/wiki/GoogleChartPlugin). Ich habe keine Probleme mit Textersetzung oder Ähnlichem. Verstehe ich dich falsch?

@BlackJack: Was wäre zum Beispiel solch eine Datei? Wie erzeuge ich diese?
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

@cofi: Ich scheine dafür auch nicht die nötigen Rechte zu haben - nun kommt die Fehlermeldung: "1Operation not permitted" :(
Sehr ärgerlich das Ganze

Edit: Nachdem ich mit "os.chmod" und "stat.S_IRWXO": read, write, and execute by others stellen wollte.
BlackJack

@mic: Du solltest keine Datei erstellen sondern den Inhalt. Wie das genau bei Trac geht weiss ich nicht, du musst halt irgendwie eine URL auf Python-Code abbilden und die benötigten Daten per GET oder POST übermitteln um dann die JSON-Daten daraus zu generieren und auszuliefern.

Im HTML müsste dann so etwas in der Art stehen:

{"data-file":"url/die/auf/python/code/umgeleitet/wird/chart-data?values=10,20,30"}

Und Du müsstest dann die Werte in JSON umwandeln das von dem Flash erwartet wird um die darzustellen.
mic
User
Beiträge: 17
Registriert: Dienstag 27. Juli 2010, 14:16

Also ich konnte die Werte tatsächlich anders angeben und muss diese nicht extra in eine Datei schreiben. Falls es jemanden genau interessiert:
http://teethgrinder.co.uk/open-flash-ch ... rial-5.php
bzw.

Code: Alles auswählen

<html>
<head>

<script type="text/javascript" src="../js/json/json2.js"></script>
<script type="text/javascript" src="js/swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("open-flash-chart.swf", "my_chart", "350", "200", "9.0.0");
</script>

<script type="text/javascript">

function ofc_ready()
{
	alert('ofc_ready');
}

function open_flash_chart_data()
{
	alert( 'reading data' );
	return JSON.stringify(data);
}

function findSWF(movieName) {
  if (navigator.appName.indexOf("Microsoft")!= -1) {
    return window[movieName];
  } else {
    return document[movieName];
  }
}
	
var data = {
  "elements": [
    {
      "type": "bar",
      "values": [
        9,
        8,
        7,
        6,
        5,
        4,
        3,
        2,
        1
      ]
    }
  ],
  "title": {
    "text": "Thu Oct 28 2010"
  }
};

</script>


</head>
<body>

<p>Hello World</p>


<div id="my_chart"></div>
 	

</body>
</html>
(ab var data kann man die Daten selbst eingeben wenn man möchte)

Vielen Dank an alle Helfer :)
Antworten