Commit 7380b5d7 authored by Thibaut Deheunynck's avatar Thibaut Deheunynck

add a render PDF for checkBoxField

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@21715 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent a72a2ebc
......@@ -38,7 +38,6 @@ from AccessControl import ClassSecurityInfo
from AccessControl.SecurityInfo import allow_class
from zLOG import LOG, PROBLEM, WARNING
import types
import popen2
import os
......@@ -87,7 +86,7 @@ class PDFTk:
def fillFormWithDict(self, pdfFile, values) :
""" fill the form with values in """
return self.fillFormWithFDF(pdfFile, self._createFdf(values))
return self.fillFormWithFDF(pdfFile, self._createFdf(pdfFile, values))
def fillFormWithFDF(self, pdfFile, fdfFile) :
""" fill the form of pdfFile with the FDF data fdfFile """
......@@ -178,20 +177,32 @@ class PDFTk:
escaped += c
return escaped
def _createFdf(self, values, pdfFormUrl=None) :
def _createFdf(self, pdfFile, values, pdfFormUrl=None) :
""" create an fdf document with the dict values """
fields = self.dumpDataFields(pdfFile)
fdf = "%FDF-1.2\x0d%\xe2\xe3\xcf\xd3\x0d\x0a"
fdf += "1 0 obj\x0d<< \x0d/FDF << /Fields [ "
for key, value in values.items():
if 0: # if the field is a check box
# ... but this is not working yet
fdf += "<< /V /%s\n/T (%s)>> \x0d" % (
value and 'Yes' or 'Off',
self._escapeString(key),)
for field in fields:
# if the field is a check box
if field.get('FieldType') == 'Button' and \
field.get('FieldStateOption') in ('Yes','Off'):
# if the check box is check
fdf += "<< /Ft /%s\n/V /%s\n/T(%s)>> \x0d" % (
'Btn',
values.get(field.get('FieldName')) and 'Yes' or 'Off',
self._escapeString(field.get('FieldName')))
# if the field is a Input Button
# ... but this is not working yet
# so there is a Warning
elif field.get('FieldType') == 'Button' and \
field.get('FieldStateOption') is None:
LOG("Field " + field.get('FieldName'),
WARNING,
"can't be returned in PDF file")
else:
fdf += "<</V (%s) /T (%s) /ClrF 2 /ClrFf 1 >> \x0d" % (
self._escapeString(value),
self._escapeString(key))
self._escapeString(values.get(field.get('FieldName'))),
self._escapeString(field.get('FieldName')))
fdf += "] \x0d"
......@@ -199,7 +210,7 @@ class PDFTk:
if pdfFormUrl not in ("", None) :
fdf += "/F ("+self._escapeString(pdfFormUrl)+") \x0d"
fdf += ">> \x0d>> \x0dendobj\x0d";
fdf += ">> \x0d>> \x0dendobj\x0d"
fdf += "trailer\x0d<<\x0d/Root 1 0 R \x0d\x0d>>\x0d%%EOF\x0d\x0a"
return fdf
......
<SCRIBUSUTF8NEW Version="1.3.3.3" >
<SCRIBUSUTF8NEW Version="1.3.3.10cvs" >
<DOCUMENT HalfRes="1" MAGMAX="800" TextPenShade="100" MAJGRID="100" ABSTSPALTEN="11" ScratchBottom="20" AUTOCHECK="0" LANGUAGE="French" DPIn2="" DPgam="0" HCMS="1" UnderlineWidth="-1" TabFill="" DGAP="0" ORIENTATION="0" PASPECT="1" WIDTH="1" POLYR="0" SHOWLINK="0" MINWORDLEN="3" UnderlinePos="-1" VTIEFSC="100" DOCLANGINFO="" COMMENTS="" AutoSaveTime="600000" POLYS="0" GuideRad="10" rulerMode="1" TITLE="" KEYWORDS="" TabWidth="36" DSIZE="12" AUTOSPALTEN="1" PAGESIZE="A4" STIL="1" TextBackGroundShade="100" PEN="Black" POLYC="4" SnapToGuides="0" GROUPC="7" DOCFORMAT="" DOCDATE="" BORDERTOP="9" currentProfile="PostScript" MARGC="#0000ff" EndArrow="0" SHOWBASE="0" SHOWGRID="0" SnapToGrid="0" GUIDELOCK="0" DIMo="1" DIPr="0" StrikeThruPos="-1" WIDTHLINE="1" TextStrokeShade="100" DPuse="0" DPSo="0" DOCSOURCE="" FIRSTNUM="1" GuideC="#000080" BRUSH="Black" StartArrow="0" ScratchRight="100" POLYF="0.5" SHOWMARGIN="1" DPbla="1" StrikeThruWidth="-1" VHOCHSC="100" DOCTYPE="" BORDERBOTTOM="40" BRUSHSHADE="100" StrokeText="Black" BASEGRID="14.4" VTIEF="33" DOCCONTRIB="" DOCRELATION="" PICTSCX="1" CPICT="White" PENLINE="Black" AutoSave="0" BASEO="0" DOCIDENT="" BOOK="0" PICTSCY="1" MAGSTEP="200" TextLineColor="None" ScratchTop="20" POLYFD="0" AUTOL="20" PUBLISHER="" ANZPAGES="1" PSCALE="1" LINESHADE="100" HYCOUNT="2" DIMo2="1" AUTHOR="" UNITS="0" BORDERRIGHT="9" RANDF="0" MAJORC="#00ff00" PENSHADE="100" PENTEXT="Black" GRAB="4" showcolborders="0" SHOWGUIDES="1" DPInCMYK="" DPPr="" DPMo="" PAGEHEIGHT="842" PAGEWIDTH="595" BACKG="1" GuideZ="10" TextBackGround="None" MINGRID="20" VHOCH="33" DOCCOVER="" DCOL="1" EmbeddedPath="0" rulerYoffset="0" SHOWPICT="1" SHOWFRAME="1" AUTOMATIC="1" ALAYER="0" DOCRIGHTS="" PICTSHADE="100" ScratchLeft="100" rulerXoffset="0" showrulers="1" DPIn="" VKAPIT="75" DFONT="Blue Highway Bold" BORDERLEFT="9" PAGEC="#ffffff" BaseC="#c0c0c0" MINORC="#00ff00" MAGMIN="10" STILLINE="1" TextLineShade="100" SHOWControl="0" >
<CheckProfile checkTransparency="1" autoCheck="1" minResolution="144" checkOverflow="1" ignoreErrors="0" checkRasterPDF="1" checkResolution="1" checkGlyphs="1" Name="PDF/X-3" checkAnnotations="1" checkPictures="1" checkOrphans="1" />
<CheckProfile checkTransparency="1" autoCheck="1" minResolution="72" checkOverflow="1" ignoreErrors="0" checkRasterPDF="1" checkResolution="1" checkGlyphs="1" Name="PDF·1.3" checkAnnotations="0" checkPictures="1" checkOrphans="1" />
......@@ -587,19 +587,12 @@
</PageSets>
<MASTERPAGE Size="A4" NUM="0" BORDERTOP="9" NAM="Normal" LEFT="0" BORDERBOTTOM="40" Orientation="0" BORDERRIGHT="9" NumVGuides="0" PAGEHEIGHT="842" PAGEWIDTH="595" PAGEYPOS="20" HorizontalGuides="" MNAM="" PAGEXPOS="100" NumHGuides="0" VerticalGuides="" BORDERLEFT="9" />
<PAGE Size="A4" NUM="0" BORDERTOP="9" NAM="" LEFT="0" BORDERBOTTOM="40" Orientation="0" BORDERRIGHT="9" NumVGuides="0" PAGEHEIGHT="842" PAGEWIDTH="595" PAGEYPOS="20" HorizontalGuides="" MNAM="Normal" PAGEXPOS="100" NumHGuides="0" VerticalGuides="" BORDERLEFT="9" />
<PAGEOBJECT OnMasterPage="" BottomLine="0" REXTRA="1" ANACTYP="0" ALIGN="0" gHeight="1.8692e-306" gWidth="1.60218e-306" LANGUAGE="French" NUMPO="16" ANBSTY="0" PLINEART="1" TXTSCALE="100" RightLine="0" LOCALSCX="1" LINESP="14.4" ROT="0" TXTSHX="5" TXTSTROKE="Black" WIDTH="18" ImageRes="1" GROUPS="" LOCKR="0" ANMC="-1" ANZIEL="0" ANKACT="" IFONT="Blue Highway Bold" LOCALSCY="1" NAMEDLST="" TXTSHY="-5" isInline="0" AUTOTEXT="0" FLIPPEDV="0" PCOLOR="None" RADRECT="0" REVERS="0" ANTOOLTIP="" PRINTABLE="1" RATIO="1" FLIPPEDH="0" COLGAP="0" PCOLOR2="None" NEXTITEM="-1" NUMGROUP="0" TransValue="0" ANICON="0" ANCHK="0" PLINEEND="0" TXTSTW="-0.1" FRTYPE="0" PTYPE="4" ImageClip="" isTableItem="0" TEXTFLOW2="0" ANHTML="0" ANXACT="" ANTYPE="4" SHADE2="100" TXTBASE="0" PWIDTH="1" HEIGHT="16" DASHOFF="0" PFILE2="" PFILE="" TEXTFLOW3="0" ANFLAG="0" ANEXTERN="../../../../../../../../../../../home" ANFACT="" ANBLACT="" ISIZE="12" PLTSHOW="0" LINESPMode="0" TXTSTYLE="0" CLIPEDIT="0" BACKITEM="-1" TransValueS="0" EMBEDDED="1" PFILE3="" ANNAME="check_box" ANCHKS="1" ANVACT="" ANFOACT="" ANEACT="" SHADE="100" TXTULP="-0.1" fillRule="1" COCOOR="0 0 0 0 18 0 18 0 18 0 18 0 18 16 18 16 18 16 18 16 0 16 0 16 0 16 0 16 0 0 0 0 " ANSCALE="0" ANROLL="" ANDACT="" BASEOF="0" PICART="1" TXTKERN="0" COLUMNS="1" OwnPage="0" LAYER="0" BOOKMARK="0" gYpos="5.00668e-308" startArrowIndex="0" TopLine="0" LOCK="0" EPROF="" ANBCOL="Black" ANFONT="8" ANFEED="1" ANCACT="" gXpos="1.89145e-307" DASHS="" IRENDER="1" TEXTFLOW="0" ANBWID="1" TXTFILLSH="100" YPOS="220" ANAA="0" ANNOTATION="1" LOCALX="0" GRTYP="0" XPOS="227" NUMCO="16" POCOOR="0 0 0 0 18 0 18 0 18 0 18 0 18 16 18 16 18 16 18 16 0 16 0 16 0 16 0 16 0 0 0 0 " EXTRA="1" ANFORMAT="0" LOCALY="0" NUMDASH="0" LeftLine="0" PRFILE="" TEXTRA="1" ANPLACE="1" ANVIS="0" ANDOWN="" SCALETYPE="1" TXTOUT="1" TXTFILL="Black" endArrowIndex="0" BEXTRA="1" ANACTION="" PLINEJOIN="0" TXTSTP="-0.1" TXTULW="-0.1" TXTSCALEV="100" TXTSTRSH="100" >
<PageItemAttributes/>
</PAGEOBJECT>
<PAGEOBJECT OnMasterPage="" BottomLine="0" REXTRA="1" ALIGN="0" gHeight="14" gWidth="6.89941e-314" LANGUAGE="French" NUMPO="16" PLINEART="1" TXTSCALE="100" RightLine="0" LOCALSCX="1" LINESP="14.4" ROT="0" TXTSHX="5" TXTSTROKE="Black" WIDTH="72" ImageRes="1" GROUPS="" LOCKR="0" IFONT="Blue Highway Bold" LOCALSCY="1" NAMEDLST="" TXTSHY="-5" isInline="0" AUTOTEXT="0" FLIPPEDV="0" PCOLOR="None" RADRECT="0" REVERS="0" PRINTABLE="1" RATIO="1" FLIPPEDH="0" COLGAP="0" PCOLOR2="None" NEXTITEM="-1" NUMGROUP="0" TransValue="0" PLINEEND="0" TXTSTW="-0.1" FRTYPE="0" PTYPE="4" ImageClip="" isTableItem="0" TEXTFLOW2="0" SHADE2="100" TXTBASE="0" PWIDTH="1" HEIGHT="24" DASHOFF="0" PFILE2="" PFILE="" TEXTFLOW3="0" ISIZE="12" PLTSHOW="0" LINESPMode="0" TXTSTYLE="0" CLIPEDIT="0" BACKITEM="-1" TransValueS="0" EMBEDDED="1" PFILE3="" ANNAME="" SHADE="100" TXTULP="-0.1" fillRule="1" COCOOR="0 0 0 0 72 0 72 0 72 0 72 0 72 24 72 24 72 24 72 24 0 24 0 24 0 24 0 24 0 0 0 0 " BASEOF="0" PICART="1" TXTKERN="0" COLUMNS="1" OwnPage="0" LAYER="0" BOOKMARK="0" gYpos="5.31794e-315" startArrowIndex="0" TopLine="0" LOCK="0" EPROF="" gXpos="1.4822e-323" DASHS="" IRENDER="1" TEXTFLOW="0" TXTFILLSH="100" YPOS="112" ANNOTATION="0" LOCALX="0" GRTYP="0" XPOS="142" NUMCO="16" POCOOR="0 0 0 0 72 0 72 0 72 0 72 0 72 24 72 24 72 24 72 24 0 24 0 24 0 24 0 24 0 0 0 0 " EXTRA="1" LOCALY="0" NUMDASH="0" LeftLine="0" PRFILE="" TEXTRA="1" SCALETYPE="1" TXTOUT="1" TXTFILL="Black" endArrowIndex="0" BEXTRA="1" PLINEJOIN="0" TXTSTP="-0.1" TXTULW="-0.1" TXTSCALEV="100" TXTSTRSH="100" >
<ITEXT CAB="0" CCOLOR="Black" CBASE="0" CSTW="-0.1" CSIZE="12" CULP="-0.1" CH="button ok :" CSHADE2="100" CKERN="0" CSCALE="100" CSHADE="100" COUT="1" CSCALEV="100" CSTP="-0.1" CULW="-0.1" CSTYLE="0" CFONT="Blue Highway Bold" CSHX="5" CSHY="-5" CSTROKE="Black" />
<PAGEOBJECT OnMasterPage="" BottomLine="0" REXTRA="1" ANACTYP="0" ALIGN="0" gHeight="1.8692e-306" gWidth="1.60218e-306" LANGUAGE="French" NUMPO="16" ANBSTY="0" PLINEART="1" TXTSCALE="100" RightLine="0" LOCALSCX="1" LINESP="14.4" ROT="0" TXTSHX="5" TXTSTROKE="Black" WIDTH="18" ImageRes="1" GROUPS="" LOCKR="0" ANMC="-1" ANZIEL="0" ANKACT="" IFONT="Blue Highway Bold" LOCALSCY="1" NAMEDLST="" TXTSHY="-5" isInline="0" AUTOTEXT="0" FLIPPEDV="0" PCOLOR="None" RADRECT="0" REVERS="0" ANTOOLTIP="" PRINTABLE="1" RATIO="1" FLIPPEDH="0" COLGAP="0" PCOLOR2="None" NEXTITEM="-1" NUMGROUP="0" TransValue="0" ANICON="0" ANCHK="0" PLINEEND="0" TXTSTW="-0.1" FRTYPE="0" PTYPE="4" ImageClip="" isTableItem="0" TEXTFLOW2="0" ANHTML="0" ANXACT="" ANTYPE="4" SHADE2="100" TXTBASE="0" PWIDTH="1" HEIGHT="16" DASHOFF="0" PFILE2="" PFILE="" TEXTFLOW3="0" ANFLAG="0" ANEXTERN="../../../../../../../home" ANFACT="" ANBLACT="" ISIZE="12" PLTSHOW="0" LINESPMode="0" TXTSTYLE="0" CLIPEDIT="0" BACKITEM="-1" TransValueS="0" EMBEDDED="1" PFILE3="" ANNAME="check_box" ANCHKS="1" ANVACT="" ANFOACT="" ANEACT="" SHADE="100" TXTULP="-0.1" fillRule="1" COCOOR="0 0 0 0 18 0 18 0 18 0 18 0 18 16 18 16 18 16 18 16 0 16 0 16 0 16 0 16 0 0 0 0 " ANSCALE="0" ANROLL="" ANDACT="" BASEOF="0" PICART="1" TXTKERN="0" COLUMNS="1" OwnPage="0" LAYER="0" BOOKMARK="0" gYpos="5.00668e-308" startArrowIndex="0" TopLine="0" LOCK="0" EPROF="" ANBCOL="Black" ANFONT="4" ANFEED="1" ANCACT="" gXpos="1.89145e-307" DASHS="" IRENDER="1" TEXTFLOW="0" ANBWID="1" TXTFILLSH="100" YPOS="213" ANAA="0" ANNOTATION="1" LOCALX="0" GRTYP="0" XPOS="223" NUMCO="16" POCOOR="0 0 0 0 18 0 18 0 18 0 18 0 18 16 18 16 18 16 18 16 0 16 0 16 0 16 0 16 0 0 0 0 " EXTRA="1" ANFORMAT="0" LOCALY="0" NUMDASH="0" LeftLine="0" PRFILE="" TEXTRA="1" ANPLACE="1" ANVIS="0" ANDOWN="" SCALETYPE="1" TXTOUT="1" TXTFILL="Black" endArrowIndex="0" BEXTRA="1" ANACTION="" PLINEJOIN="0" TXTSTP="-0.1" TXTULW="-0.1" TXTSCALEV="100" TXTSTRSH="100" >
<PageItemAttributes/>
</PAGEOBJECT>
<PAGEOBJECT OnMasterPage="" BottomLine="0" REXTRA="1" ALIGN="0" gHeight="1.61324e-307" gWidth="2.11387e-307" LANGUAGE="French" NUMPO="16" PLINEART="1" TXTSCALE="100" RightLine="0" LOCALSCX="1" LINESP="14.4" ROT="0" TXTSHX="5" TXTSTROKE="Black" WIDTH="72" ImageRes="1" GROUPS="" LOCKR="0" IFONT="Blue Highway Bold" LOCALSCY="1" NAMEDLST="" TXTSHY="-5" isInline="0" AUTOTEXT="0" FLIPPEDV="0" PCOLOR="None" RADRECT="0" REVERS="0" PRINTABLE="1" RATIO="1" FLIPPEDH="0" COLGAP="0" PCOLOR2="None" NEXTITEM="-1" NUMGROUP="0" TransValue="0" PLINEEND="0" TXTSTW="-0.1" FRTYPE="0" PTYPE="4" ImageClip="" isTableItem="0" TEXTFLOW2="0" SHADE2="100" TXTBASE="0" PWIDTH="1" HEIGHT="24" DASHOFF="0" PFILE2="" PFILE="" TEXTFLOW3="0" ISIZE="12" PLTSHOW="0" LINESPMode="0" TXTSTYLE="0" CLIPEDIT="0" BACKITEM="-1" TransValueS="0" EMBEDDED="1" PFILE3="" ANNAME="" SHADE="100" TXTULP="-0.1" fillRule="1" COCOOR="0 0 0 0 72 0 72 0 72 0 72 0 72 24 72 24 72 24 72 24 0 24 0 24 0 24 0 24 0 0 0 0 " BASEOF="0" PICART="1" TXTKERN="0" COLUMNS="1" OwnPage="0" LAYER="0" BOOKMARK="0" gYpos="5.00668e-308" startArrowIndex="0" TopLine="0" LOCK="0" EPROF="" gXpos="1.42416e-306" DASHS="" IRENDER="1" TEXTFLOW="0" TXTFILLSH="100" YPOS="217" ANNOTATION="0" LOCALX="0" GRTYP="0" XPOS="146" NUMCO="16" POCOOR="0 0 0 0 72 0 72 0 72 0 72 0 72 24 72 24 72 24 72 24 0 24 0 24 0 24 0 24 0 0 0 0 " EXTRA="1" LOCALY="0" NUMDASH="0" LeftLine="0" PRFILE="" TEXTRA="1" SCALETYPE="1" TXTOUT="1" TXTFILL="Black" endArrowIndex="0" BEXTRA="1" PLINEJOIN="0" TXTSTP="-0.1" TXTULW="-0.1" TXTSCALEV="100" TXTSTRSH="100" >
<ITEXT CAB="0" CCOLOR="Black" CBASE="0" CSTW="-0.1" CSIZE="12" CULP="-0.1" CH="check box" CSHADE2="100" CKERN="0" CSCALE="100" CSHADE="100" COUT="1" CSCALEV="100" CSTP="-0.1" CULW="-0.1" CSTYLE="0" CFONT="Blue Highway Bold" CSHX="5" CSHY="-5" CSTROKE="Black" />
<PageItemAttributes/>
</PAGEOBJECT>
<PAGEOBJECT OnMasterPage="" BottomLine="0" REXTRA="1" ANACTYP="0" ALIGN="0" gHeight="6.47634e-318" gWidth="4.89588e-307" LANGUAGE="French" NUMPO="16" ANBSTY="0" PLINEART="1" TXTSCALE="100" RightLine="0" LOCALSCX="1" LINESP="14.4" ROT="0" TXTSHX="5" TXTSTROKE="Black" WIDTH="58" ImageRes="1" GROUPS="" LOCKR="0" ANMC="-1" ANZIEL="0" ANKACT="" IFONT="Blue Highway Bold" LOCALSCY="1" NAMEDLST="" TXTSHY="-5" isInline="0" AUTOTEXT="0" FLIPPEDV="0" PCOLOR="None" RADRECT="0" REVERS="0" ANTOOLTIP="" PRINTABLE="1" RATIO="1" FLIPPEDH="0" COLGAP="0" PCOLOR2="None" NEXTITEM="-1" NUMGROUP="0" TransValue="0" ANICON="0" ANCHK="0" PLINEEND="0" TXTSTW="-0.1" FRTYPE="0" PTYPE="4" ImageClip="" isTableItem="0" TEXTFLOW2="0" ANHTML="0" ANXACT="" ANTYPE="2" SHADE2="100" TXTBASE="0" PWIDTH="1" HEIGHT="24" DASHOFF="0" PFILE2="" PFILE="" TEXTFLOW3="0" ANFLAG="65536" ANEXTERN="../" ANFACT="" ANBLACT="" ISIZE="12" PLTSHOW="0" LINESPMode="0" TXTSTYLE="0" CLIPEDIT="0" BACKITEM="-1" TransValueS="0" EMBEDDED="1" PFILE3="" ANNAME="" ANCHKS="0" ANVACT="" ANFOACT="" ANEACT="" SHADE="100" TXTULP="-0.1" fillRule="1" COCOOR="0 0 0 0 58 0 58 0 58 0 58 0 58 24 58 24 58 24 58 24 0 24 0 24 0 24 0 24 0 0 0 0 " ANSCALE="0" ANROLL="OOK" ANDACT="" BASEOF="0" PICART="1" TXTKERN="0" COLUMNS="1" OwnPage="0" LAYER="0" BOOKMARK="0" gYpos="6.89781e-307" startArrowIndex="0" TopLine="0" LOCK="0" EPROF="" ANBCOL="Black" ANFONT="4" ANFEED="1" ANCACT="" gXpos="3.73849e-306" DASHS="" IRENDER="1" TEXTFLOW="0" ANBWID="1" TXTFILLSH="100" YPOS="114" ANAA="0" ANNOTATION="1" LOCALX="0" GRTYP="0" XPOS="223" NUMCO="16" POCOOR="0 0 0 0 58 0 58 0 58 0 58 0 58 24 58 24 58 24 58 24 0 24 0 24 0 24 0 24 0 0 0 0 " EXTRA="1" ANFORMAT="0" LOCALY="0" NUMDASH="0" LeftLine="0" PRFILE="" TEXTRA="1" ANPLACE="1" ANVIS="0" ANDOWN="OK" SCALETYPE="1" TXTOUT="1" TXTFILL="Black" endArrowIndex="0" BEXTRA="1" ANACTION="" PLINEJOIN="0" TXTSTP="-0.1" TXTULW="-0.1" TXTSCALEV="100" TXTSTRSH="100" >
<PageItemAttributes/>
</PAGEOBJECT>
</DOCUMENT>
</SCRIBUSUTF8NEW>
......@@ -155,6 +155,8 @@ class TestPDFFormButtons(unittest.TestCase):
# XXX for debugging:
# file('/tmp/out.pdf', 'w').write(self.pdf_form())
# os.system('xpdf /tmp/out.pdf')
# os.system('kpdf /tmp/out.pdf')
# os.system('acroread /tmp/out.pdf')
def test_suite():
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment