एटलसियन कॉन्फ्लुएंस: अजगर में एक्स्टेंसिबल

Alfastrakhovanie में हम सक्रिय रूप से "विकी" का उपयोग करते हैं, जिसका इंजन एटलसियन कंफ्लुएंस है। पहली बार जब मैं इसके बारे में गंभीरता से आया (इसमें सामग्री बनाने के प्रयास में), मेरे पास इसमें "गतिशीलता" का अभाव था - मैं प्रोग्राम के पृष्ठों के कुछ हिस्सों को बनाने, अन्य प्रणालियों के साथ बातचीत करने आदि में सक्षम होना चाहता था।


कुछ समय के लिए उसने विभिन्न दीवारों के खिलाफ अपना सिर पीटा, लेकिन फिर उसने देखा कि "घर में एक भी दीवार नहीं थी।" मैं अपने अनुभव को साझा करना चाहता हूं - मैं कंफ्लुएंस में वक्ताओं को कैसे जोड़ सकता हूं। मुझे उम्मीद है कि यह उन लोगों के लिए उपयोगी होगा जो इसका उपयोग करते हैं। और, हमेशा की तरह, हर किसी के लिए जिज्ञासु।


गतिशील विकि


प्रारंभ में, Confluence अपनी कार्यक्षमता - प्लगइन्स का विस्तार करने के लिए एक सार्वभौमिक तरीका सुझाता है। शायद, वह अच्छा है, केवल एक खामी है - एक उच्च प्रविष्टि सीमा (आपको बहुत कुछ सीखने की जरूरत है)।


एक छोटे विचार (अंतरिक्ष मानकों के अनुसार) के बाद, इसकी कार्यक्षमता का विस्तार करने के लिए दो और सरल तरीके थे: मानक मैक्रो "HTML" और "HTML शामिल करें", इस लेख में मैं अधिक विस्तार से उत्तरार्द्ध पर ध्यान केंद्रित करूंगा।


इन विधियों के लिए संचालन का एक सिद्धांत है - HTML कोड कॉन्फ्लुएंस पेज में एम्बेडेड है, यह स्थिर हो सकता है (जो दिलचस्प भी हो सकता है, उदाहरण के लिए, गैर-मानक पृष्ठ स्वरूपण के लिए), और गतिशील (सर्वर घटकों सहित) हो सकता है।


उदाहरण: सुलह का अनुरोध


आइए एक साधारण उदाहरण - एक दस्तावेज़ अनुमोदन सूची के साथ संगम की क्षमताओं का विस्तार करने के प्रस्तावित तरीके को देखें।


हम क्या करना चाहते हैं: पृष्ठ में अनुमोदन की एक सूची जोड़ें ताकि हर कोई यह देख सके कि दस्तावेज़ का समन्वय किसे करना चाहिए, क्या यह सहमति हुई थी, और यदि हां, तो कब।


सुविधा के लिए, हम सूची आइटम को एक बटन बनाएंगे और उसमें समन्वयक का नाम लिखेंगे। यदि समन्वयक द्वारा पृष्ठ देखा जाता है, तो बटन सक्रिय होगा और अन्य सभी मामलों में सक्रिय नहीं होगा।


अनुमोदन के बाद, बटन "बटन होना बंद हो जाएगा" - अनुमोदन के बाद बटन के बजाय, हम पृष्ठ पर एक पाठ (अनुमोदन का नाम और अनुमोदन की तारीख) के रूप में अनुमोदन के तथ्य को आकर्षित करेंगे। सबसे ड्राफ्ट संस्करण में (बिना डिजाइन के) यह कुछ इस तरह दिख सकता है:


छवि


सहभागिता योजना


छवि


टिप्पणियाँ - यह कैसे काम करता है:


  • कॉन्फ्लुएंस में पेज में कई मैक्रो "html शामिल हैं" - वास्तव में मापदंडों के साथ HTTP जीईटी अनुरोध (हम नीचे और अधिक विस्तार से विचार करेंगे)
  • किसी पृष्ठ को प्रस्तुत करते समय, इन अनुरोधों (अजगर लिपियों) को एप्लिकेशन सर्वर पर निष्पादित किया जाता है, परिणाम (उत्पन्न HTML) पृष्ठ पर निकाला जाता है
  • अपने काम के दौरान, स्क्रिप्ट, उदाहरण के लिए, पृष्ठ पर हस्ताक्षर करने के इतिहास के साथ डेटाबेस से संपर्क करता है, अगर पृष्ठ पर हस्ताक्षरकर्ता द्वारा अभी तक "हस्ताक्षरित" नहीं किया गया है - एचटीएमएल में एक बटन होगा (जैसा कि ऊपर वर्णित सब कुछ है)
  • जब आप बटन पर क्लिक करते हैं, तो सबमिट होता है - एक और अजगर स्क्रिप्ट कहा जाता है (सुलह के तथ्य को संसाधित करने के लिए एक स्क्रिप्ट)
  • यह स्क्रिप्ट डेटाबेस में साइन इन करने के तथ्य के बारे में जानकारी बचाता है और उपयोगकर्ता को मूल पृष्ठ पर वापस भेज देता है (जब प्रतिपादन के तथ्य को ध्यान में रखा जाएगा - "साइन" बटन पर क्लिक करके)

शब्दों में थोड़ा जटिल, चलो कोड को स्पष्ट करने का प्रयास करें।


इसलिए हमें दो स्क्रिप्ट बनाने की जरूरत है


  • "साइन" बटन के गठन की स्क्रिप्ट (मैं इसे स्क्रिप्ट "बटन" कहूंगा)
  • हस्ताक्षर करने के तथ्य पर काम करने के लिए एक स्क्रिप्ट (एक बटन क्लिक पर प्रतिक्रिया - मैं इसकी स्क्रिप्ट "हैंडलर" कहूंगा)

चलो उन्हें बनाते हैं, बटन से शुरू करते हैं।


स्क्रिप्ट बटन


योजनाबद्ध तरीके से, बटन स्क्रिप्ट कैसे काम करती है:


date = getSignDate() if date: #       . else: if user==signee: #    else: #  inactive  

स्क्रिप्ट एक मान्य HTML दस्तावेज़ होनी चाहिए, जिसका शरीर सबसे न्यूनतम रूप में है


  • फ़ॉर्म की कार्रवाई में स्क्रिप्ट का URL होता है
  • सक्रिय बटन सबमिट है
  • छिपे हुए प्रपत्र फ़ील्ड में हैंडलर के लिए अतिरिक्त पैरामीटर होते हैं (हमारे मामले में, पृष्ठ का नाम और हस्ताक्षर लॉगिन)

स्क्रिप्ट का एक अनुमानित दृश्य (संक्षिप्तता के लिए, मैंने सब कुछ अनावश्यक रूप से फेंक दिया - जीथ्यूब पर पूर्ण कार्य कोड देखें)


 form = cgi.FieldStorage() signee = form["signee"].value #   (  ) actual = form["actual"].value #    id = form["id"].value #  ,    resHtml = """ <!DOCTYPE HTML> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> <body> <form name="input" action="http://172.16.108.216/misc/sign_proc.py" method="get"> """ server, token = wikiLogin() #   Confluence userName = getUserName(token, signee) #        res = getSignDate(id, signee) #     if res: #    resHtml += "<p> ({0}, {1})</p>".format(userName, res) #   else: #    if signee.lower() == actual.lower(): #      -   resHtml += '<input type="hidden" name="id" value="{0}">'.format(id) resHtml += '<input type="hidden" name="signee" value="{0}">'.format(signee) resHtml += "   <input type=\"submit\" value=\"{0}\">".format(userName) else: #      -    resHtml += "   <input disabled type=\"submit\" value=\"{0}\">".format(userName) resHtml += "</form></body></html>" #   HTML sys.stdout.buffer.write(b'Content-Type: text/html;charset=utf-8\n\n') sys.stdout.buffer.write(resHtml.encode("utf-8")) 

स्क्रिप्ट "हैंडलर"


हैंडलर का कार्य बहुत सरल है - "सहमत" बटन दबाने के तथ्य को ठीक करना। फिर उस पृष्ठ पर पुनः निर्देशित करें जहां अनुरोध आया था - पृष्ठ का प्रतिपादन करते समय, समन्वय के तथ्य को पहले से ही ध्यान में रखा जाएगा (ऊपर विवरण देखें)।


एक उदाहरण (संक्षिप्त) स्क्रिप्ट "हैंडलर" (पूर्ण संस्करण - जीथब देखें)


 form = cgi.FieldStorage() signee = form["signee"].value #   id = form["id"].value #  ,    addSignDate(id, signee) #    resHtml = """ <html> <head> <meta http-equiv="refresh" content="5;url=http://wiki.alfastrah.ru/display/DIT/{0}"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title> </title> </head> <body> <p>    <b>{0}</b>  <b>{1}</b> . <br>      ...</p> </body> </html> """.format(id, signee) sys.stdout.buffer.write(b'Content-Type: text/html;charset=utf-8\n\n') sys.stdout.buffer.write(resHtml.encode("utf-8")) 

संघर्ष में पेज


Confluence के पृष्ठ में तीन मैक्रो HTML शामिल हैं, जिसमें विभिन्न पैरामीटर हैं (नीचे दिए गए कोड देखें) और सबसे सरल संस्करण इस तरह दिखता है:


छवि


विकी मार्कअप प्रारूप में पेज कोड - यहां आप पैरामीटर देख सकते हैं


 <h1> </h1> <p> ,  </p> <h1> </h1> <ul> <li> <ac:structured-macro ac:macro-id="..." ac:name="html-include" ac:schema-version="1"> <ac:parameter ac:name="url"> <ri:url ri:value="http://z14-0510-wiksap.vesta.ru/misc/sign_btn.py?signee=boss&amp;actual=korolevmv&amp;id=wikitools_sign"/> </ac:parameter> </ac:structured-macro> </li> <li> <ac:structured-macro ac:macro-id="..." ac:name="html-include" ac:schema-version="1"> <ac:parameter ac:name="url"> <ri:url ri:value="http://z14-0510-wiksap.vesta.ru/misc/sign_btn.py?signee=korolevmv&amp;actual=korolevmv&amp;id=wikitools_sign"/> </ac:parameter> </ac:structured-macro> </li> <li> <ac:structured-macro ac:macro-id="..." ac:name="html-include" ac:schema-version="1"> <ac:parameter ac:name="url"> <ri:url ri:value="http://z14-0510-wiksap.vesta.ru/misc/sign_btn.py?signee=maxvar&amp;actual=korolevmv&amp;id=wikitools_sign"/> </ac:parameter> </ac:structured-macro> </li> </ul> 

स्थापित करने के बारे में थोड़ा सा


वर्णित योजना के काम करने के लिए, निम्नलिखित को ध्यान में रखना आवश्यक है


HTML की उपलब्धता मैक्रो को शामिल करें


कभी-कभी प्रशासक इसे "छिपाते हैं" - इसके लिए बहुत सारी अतिरिक्त समस्याएं हैं (संभावनाओं का दूसरा पक्ष)।


यह मैक्रो मुफ़्त है और कंफ़्लुएंस का हिस्सा है - यदि आपके पास एक नहीं है, तो प्रशासकों से संपर्क करें, उन्हें देखने दें ...


संगम सफेद सूची


अज्ञात स्रोतों पर होस्ट की गई स्क्रिप्ट्स को निष्पादित नहीं करेगा, जिस होस्ट पर स्क्रिप्ट होस्ट की गई है वह तथाकथित "व्हाइट लिस्ट" (प्रवेशों से संपर्क करें) में होनी चाहिए। यह केवल "बटन" स्क्रिप्ट पर लागू होता है - हैंडलर की स्क्रिप्ट को पहले से ही बटन द्वारा कहा जाता है, कंफ्लुएंस प्रतिबंध उस पर लागू नहीं होता है।


स्क्रिप्ट निष्पादन


लिपियों (बटन और एक हैंडलर) को निष्पादन योग्य होना चाहिए - URL को ब्राउज़र में कॉपी करें, इसे HTML को वर्कआउट और जेनरेट करना चाहिए, अगर ऐसा नहीं हुआ, तो इसे डीबग करें।


स्क्रिप्ट की त्रुटियां


यदि स्क्रिप्ट में से कोई भी त्रुटि के साथ दुर्घटनाग्रस्त हो जाती है - तो आपको कंफ्लुएंस के प्रकाशन से पहले कुछ भी अच्छा नहीं दिखाई देगा, ठीक से डिबग करें।


स्क्रिप्ट विकल्प


एक जिज्ञासु मन स्क्रिप्ट मापदंडों पर ध्यान दे सकता है - एक तरफ, वे निरर्थक हैं (उदाहरण के लिए, उस पृष्ठ का नाम जिस पर अनुमोदन बटन रखा गया है - क्या यह जाना जाता है, इसे क्यों भरें?)। दूसरी ओर, वे असुरक्षित हैं (हमारे उदाहरण में "हमलावर" अपने स्वयं के लिए अनुमोदनकर्ता के नाम को बदल सकता है या बिल्कुल सुलह बटन को हटा सकता है)।


उपयोगकर्ता मैक्रोज़ द्वारा अतिरेक को "दूर" किया जा सकता है (मैं लंबे समय से सोच रहा था - वे व्यावहारिक रूप से कैसे उपयोगी हो सकते हैं? मैं एक अलग लेख में संक्षेप में लिखूंगा)। कॉन्फ्लुएंस में सुरक्षा पृष्ठ के इतिहास द्वारा सुनिश्चित की जाती है - सभी "चाल" दर्ज की जाती हैं, आप कुछ भी बदल सकते हैं, कंफ्लुएंस में एक अद्भुत "ऑडिट ट्रेल" बनी हुई है जो आपको विस्तार से समझने की अनुमति देती है कि किसने और कब बदला।


पृष्ठ सहभागिता


हमारे व्यवहार में, ऐसे मामले आए हैं जब हमें डेटा इकट्ठा करने के लिए पेज कोड को पार्स करना पड़ा (उदाहरण के लिए, यह है कि हमने परियोजनाओं के पोर्टफोलियो को कैसे प्रबंधित किया)। यह संभव भी है और मुश्किल भी नहीं। विकास के रूप में, हम इस निष्कर्ष पर पहुंचे हैं कि यदि किसी पृष्ठ पर कुछ जानकारी की आवश्यकता केवल उस कोड के लिए है जो इस जानकारी की व्याख्या करता है, तो यह जानकारी तुरंत कोड में स्वयं तैयार करना आसान है (JSON के रूप में, उदाहरण के लिए): पृष्ठ संपादन मोड में इसे संपादित करना काफी सरल है , यह कार्यक्रम द्वारा तैयार किया गया है, लेकिन पार्सिंग और बढ़ी हुई विश्वसनीयता पर बचत महत्वपूर्ण है।


और उदाहरण


हमने इन मैक्रोज़ का उपयोग क्यों किया (विचारों के रूप में - अचानक कुछ उपयोगी साबित होता है), बहुत संक्षेप में


पृष्ठ डिज़ाइन: यदि आप पृष्ठ को गैर-मानक तरीके से डिज़ाइन करना चाहते हैं - CSS का उपयोग करके मार्कअप, जो HTML ब्लॉक में समाहित है


अवकाश कैलेंडर : हम कुछ सरल जेएस कैलेंडर का उपयोग करते हैं, इसे JSON के डेटा से भरते हैं, जिसे हम सीधे पेज कोड में संपादित करते हैं, हमें एक सुंदर प्लेट मिलती है जिसमें टूटे हुए वर्ष (वर्ष, माह, सप्ताह) होते हैं।


एक विक्रम बोर्ड के लिए मुद्रण कार्य कार्ड : हम विकी पृष्ठ (HTML ब्लॉक में) पर सही रूप में पैरामीटर (जिरा और अतिरिक्त विशेषताओं में कार्य संख्या) सेट करते हैं, सर्वर साइड कार्ड को एक प्रिंटर भेजने के लिए उपयुक्त रूप में बनाते हैं।


परियोजना पोर्टफोलियो प्रबंधन : हमारे पास ऐसा विचार था। विकी पर नक्शे को सही तरीके से बनाया गया था (स्कोर मैप एक विशेष रूप से चिह्नित पृष्ठ है), इन मानचित्रों ने एक बड़ी-ब्लॉक योजना एकत्र की, जिसे गैंट चार्ट के रूप में खूबसूरती से तैयार किया गया था।


शब्दावली : शब्दों की कल्पना करने की क्षमता - एक पृष्ठ के अलग-अलग शब्दों के लिए स्पष्टीकरण - एक सामान्य शब्दकोश और "पॉप-अप" के रूप में शब्दकोश प्रविष्टियों को जारी करने से। शब्दकोश स्वयं पृष्ठ के निचले भाग में एकत्र किया जाता है।


चार्ट : यदि आपको किसी प्रकार के सरल चार्ट को बनाने की आवश्यकता है, तो HTML ब्लॉक को किसी भी मानक पैकेज (Google चार्ट, हाईचर्ट्स, आदि) के साथ एम्बेड करके ऐसा करना बहुत सरल है।


टेबल्स : कंफ्लूएंस में किसी भी टेबल के ऊपर आप "हैंगेट" लटका सकते हैं - हमें "पेजिनेशन" के साथ एक फ़िल्टर की गई टेबल मिलती है, बहुत अच्छी और सुविधाजनक।


सूची को लंबे समय तक जारी रखा जा सकता है, ऑपरेशन के दौरान, एक महत्वपूर्ण असुविधा देखी गई: सर्वर कोड में त्रुटियों को खराब रूप से पकड़ा जाता है - 500 त्रुटियों को खराब रूप से कल्पना की जाती है और व्यावहारिक रूप से जानकारी नहीं होती है। अन्यथा, प्रयोग करें - यह पर्याप्त सुरक्षित है।


संक्षेप में देना


कंफ्लुएंस की गतिशीलता को बढ़ाने के लिए ऊपर वर्णित सरल तरीका आपको कई अलग-अलग समस्याओं को हल करने की अनुमति देता है। इसका उपयोग करने के लिए विशेष उपकरण और कौशल की आवश्यकता नहीं होती है। उपयोग काफी सुरक्षित है। मैं इसकी सलाह देता हूं।


अगले लेख में मैं Confluence में कस्टम मैक्रो का उपयोग करने के अनुभव के बारे में बात करूंगा - जो, मेरी राय में, वास्तव में उनकी मदद से सुधार किया जा सकता है।


प्रोग्रामिंग में सब कुछ संभव है - केवल समय और प्रेरणा की बात।

Source: https://habr.com/ru/post/hi460929/


All Articles