zope.generations

সফটওয়্যার স্ক্রিনশট:
zope.generations
সফটওয়্যার বিবরণ:
সংস্করণ: 4.0.0 Alpha 1
তারিখ আপলোড: 15 Apr 15
ডেভেলপার: Zope Corporation and Contributors
লাইসেন্স: বিনামূল্যে
জনপ্রিয়তা: 2

Rating: nan/5 (Total Votes: 0)

zope.generations ডাটাবেসের মধ্যে উপস্থিত আপডেট করার সময় একটি উপায় প্রদান করে যখন আবেদন স্কিমা পরিবর্তন. & Nbsp; একটি আবেদন স্কিমা মূলত তথ্য গঠন, ZODB ক্ষেত্রে বা ক্ষেত্রে টেবিল বিবরণ মধ্যে ক্লাস গঠন একটি রিলেশনাল ডাটাবেস.
বিস্তারিত নথিপত্র
প্রজন্মের ডাটাবেস যখন অ্যাপ্লিকেশন স্কিমা পরিবর্তন বস্তু আপডেট করার সময় একটি উপায়. একটি আবেদন স্কিমা মূলত তথ্য গঠন, ZODB বা একটি রিলেশনাল ডাটাবেস ক্ষেত্রে টেবিল বর্ণনা ক্ষেত্রে ক্লাস স্ট্রাকচার.
আপনি আপনার আবেদন এর ডাটা স্ট্রাকচার পরিবর্তন, উদাহরণস্বরূপ, যদি আপনি একটি বর্গ একটি বিদ্যমান ক্ষেত্র শব্দার্থিক অর্থ পরিবর্তন, আপনি আপনার পরিবর্তন করার আগে তৈরি করা হয়েছিল যে উপাত্ত সঙ্গে একটি সমস্যা হবে. আরো একটি পুঙ্খানুপুঙ্খ আলোচনা এবং সম্ভব সমাধানের জন্য, http://wiki.zope.org/zope3/DatabaseGenerations দেখতে
আমরা উপাদান আর্কিটেকচার ব্যবহার করা হবে, এবং আমরা একটি ডাটাবেস এবং একটি সংযোগ করতে হবে:
& Nbsp; >>> আমদানি সিজিআই
& Nbsp; >>> pprint আমদানি pprint থেকে
& Nbsp; >>> zope.interface আমদানি কার্যকরী থেকে
& Nbsp; >>> থেকে ZODB.tests.util আমদানি ডিবি
& Nbsp; >>> ডিবি = ডিবি ()
& Nbsp; >>> Conn = db.open ()
& Nbsp; >>> রুট = conn.root ()
আমাদের অ্যাপ্লিকেশন একটি ওরাকল যে কল্পনা করা: আপনি যদি বাক্যাংশ প্রতিক্রিয়া এটা শেখানো যেতে পারে. এর এটা সহজ রাখা এবং একটি অভি মধ্যে তথ্য সংরক্ষণ করা যাক:
& Nbsp; >>> রুট ['উত্তর'] = {'হ্যালো': 'হাই ও আপনি কিভাবে করব',
& Nbsp; ... '? জীবনের অর্থ': '42',
& Nbsp; ... 'চার & Nbsp; >>> আমদানি লেনদেন
& Nbsp; >>> transaction.commit ()
প্রাথমিক সেটআপ
এখানে কিছু প্রজন্মের নির্দিষ্ট কোড এর. আমরা তৈরি এবং একটি SchemaManager রেজিস্টার হবে. SchemaManagers ডাটাবেস প্রকৃত আপডেটের জন্য দায়ী. এই একটি মাত্র একটি ডামি হতে হবে. এখানে বিন্দু প্রজন্মের আমাদের আবেদন প্রজন্মের সমর্থন করে সচেতন মডিউল করা হয়.
এটা প্রজন্মের পরিচালনা করতে পাইথন মডিউল ব্যবহার করে, কারণ SchemaManager ডিফল্ট বাস্তবায়ন এই পরীক্ষার জন্য উপযুক্ত নয়. আমরা এটা এখনও কিছু করতে চান না, যেহেতু এখন জন্য, এটা, শুধু জরিমানা হবে.
& Nbsp; >>> zope.generations.interfaces ISchemaManager আমদানি থেকে
& Nbsp; >>> zope.generations.generations SchemaManager আমদানি থেকে
& Nbsp; >>> আমদানি zope.component
& Nbsp; >>> dummy_manager = SchemaManager (minimum_generation = 0, প্রজন্মের = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... dummy_manager, ISchemaManager, নাম = 'some.app')
'Some.app' একটি অনন্য শনাক্তকারী হয়. আপনি কোনো URI অথবা আপনার প্যাকেজের ডটেড নাম ব্যবহার করা উচিত.
আপনি Zope শুরু এবং একটি ডাটাবেস খোলা হয়, একটি ঘটনা IDatabaseOpenedWithRoot পাঠানো হয়. Zope এই ঘটনার জন্য একটি হ্যান্ডলার হিসাবে ডিফল্ট evolveMinimumSubscriber খাতাপত্র. এই নকল করা যাক:
& Nbsp; >>> বর্গ DatabaseOpenedEventStub (বস্তু):
& Nbsp; ... Def __init __ (স্ব ডাটাবেস):
& Nbsp; ... self.database = ডাটাবেস
& Nbsp; >>> ঘটনা = DatabaseOpenedEventStub (ডিবি)
& Nbsp; >>> zope.generations.generations evolveMinimumSubscriber আমদানি থেকে
& Nbsp; >>> evolveMinimumSubscriber (ইভেন্ট)
এই কর্মের ফল এখন ডাটাবেসের আমাদের বর্তমান স্কিমা সংখ্যা আমরা স্কিমা আপডেট, Zope3 শুরু ছিল একটি ধারণা আছে, 0 যে উপস্থিত হয়. এখানে, দেখতে?
& Nbsp; >>> zope.generations.generations generations_key আমদানি থেকে
& Nbsp; >>> রুট [generations_key] ['some.app']
& Nbsp; 0
বাস্তব জীবনে আপনি সরাসরি এই কি দিয়ে বিরক্ত করতে হবে না, কিন্তু আপনি যে উপস্থিত সচেতন হতে হবে.
আপগ্রেড দৃশ্যকল্প
পিছনে গল্প. কিছু সময় পাস এবং আমরা এইচটিএমএল বিশেষ অক্ষর অব্যাহতি ভুলে গেছি, কারণ আমাদের ক্লায়েন্ট এক গভীর ক্ষত পায়! ভয়াবহ! আমরা কোন ডেটা হারানো ছাড়া যত শীঘ্র সম্ভব এই সমস্যা সমাধানের জন্য নয়. আমরা আমাদের সহকর্মীদের ছাপ প্রজন্মের ব্যবহার করার সিদ্ধান্ত নেন.
এর স্কিমা পরিচালক আপডেট (পুরানো এক ড্রপ এবং একটি নতুন কাস্টম ইনস্টল) করা যাক:
& Nbsp; >>> zope.component আমদানি globalregistry থেকে
& Nbsp; >>> জিএসএম = globalregistry.getGlobalSiteManager ()
& Nbsp; >>> gsm.unregisterUtility (সরবরাহ = ISchemaManager, নাম = 'some.app')
& Nbsp; সত্য
& Nbsp; >>> বর্গ MySchemaManager (বস্তু):
& Nbsp; ... কার্যকরী (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... প্রজন্মের = 2
& Nbsp; ...
& Nbsp; ... Def (স্ব, কনটেক্সট, প্রজন্মের) বিকশিত:
& Nbsp; ... রুট = context.connection.root ()
& Nbsp; ... উত্তর = রুট ['উত্তর']
& Nbsp; ... যদি প্রজন্মের == 1:
& Nbsp; ... প্রশ্নের জন্য, answers.items উত্তর: ()
& Nbsp; ... উত্তর [প্রশ্ন] = cgi.escape (উত্তর)
& Nbsp; ... Elif প্রজন্মের == 2:
& Nbsp; ... প্রশ্নের জন্য, answers.items উত্তর: ()
& Nbsp; ... দেল উত্তর [প্রশ্ন]
& Nbsp; ... উত্তর [cgi.escape (প্রশ্ন)] = উত্তর
& Nbsp; ... অন্য:
& Nbsp; ... ("অকর্মা") শাহো লিখেছেন বাড়াতে
& Nbsp; ... রুট ['উত্তর'] উত্তর # পিং অধ্যবসায় =
& Nbsp; ... transaction.commit ()
& Nbsp; >>> পরিচালক = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (ম্যানেজার, ISchemaManager, নাম = 'some.app')
আমরা আমাদের আবেদন এই SchemaManager জানেন যে সর্বশেষ প্রজন্মের প্রায় 2, যার মানে প্রজন্ম বৈশিষ্ট্য 2 সেট করা হয় প্রজন্মের 1. আর পুরোনো একটি ডাটাবেস, সঙ্গে চালানো প্রত্যাখ্যান করবে মানে 1 minimum_generation সেট আছে.
() অভিব্যক্ত workhorse এখানে. তার কাজের-1 থেকে প্রজন্মের ডাটাবেস পেতে হয়. এটা ZODB থেকে একটি সংযোগ, যা বৈশিষ্ট্য 'সংযোগ' আছে, যা একটি প্রেক্ষাপটে পায়. আপনি এই উদাহরণে মত বস্তু পরিবর্তন করতে ব্যবহার করতে পারেন.
(তারা যে কেউ প্রবেশ করতে পারেন, কারণ, গুরুতর বলে,!) এই বিশেষ বাস্তবায়ন প্রজন্মের মধ্যে 1 উত্তর বেরিয়ে যায়, প্রজন্ম 2 প্রশ্ন পালাতে (কম গুরুত্বপূর্ণ বলে, এই অনুমোদিত personell শুধুমাত্র দ্বারা প্রবেশ করা যাবে, কারণ).
আসলে, আপনি কি সত্যিই ISchemaManager একটি কাস্টম বাস্তবায়ন হবে না. এক আমরা পূর্বে একটি ডামি জন্য এটি ব্যবহার করা হয়েছে, পাওয়া যায়. এটা Evolver ফাংশন প্রতিষ্ঠানের জন্য পাইথন মডিউল ব্যবহার করে. আরও তথ্যের জন্য তার docstring দেখুন.
বাস্তব জীবনে আপনি এখানে এক তুলনায় অনেক বেশি জটিল বস্তু কাঠামো হবে. FindObjectsMatching () এবং findObjectsProviding (): আপনার জীবন সহজ করা, zope.generations.utility পাওয়া দুটি খুব দরকারী ফাংশন আছে. তারা আপনাকে ইন্টারফেস দ্বারা বা অন্য কিছু বৈশিষ্ট্যে, আপডেট করতে ইচ্ছুক যে পুরানো বস্তু চাইতে আউট করতে সাহায্য করার জন্য পৌনঃপুনিকভাবে পাত্রে মাধ্যমে খনন করা হবে. তারা তাদের docstrings পরীক্ষা, বুঝতে সহজ হয়.
কর্ম প্রজন্মের
সুতরাং, আমাদের প্রচণ্ড ক্লায়েন্ট আমাদের সর্বশেষ কোড ডাউনলোড এবং Zope পুনরায় আরম্ভ. ঘটনা স্বয়ংক্রিয়ভাবে আবার পাঠানো হয়:
& Nbsp; >>> ঘটনা = DatabaseOpenedEventStub (ডিবি)
& Nbsp; >>> evolveMinimumSubscriber (ইভেন্ট)
Shazam জন্য! ক্লায়েন্ট আবার খুশি!
& Nbsp; >>> pprint (root পরিচয়ে ['উত্তর'])
& Nbsp; {'হ্যালো': 'হাই ও আপনি কিভাবে করব?',
& Nbsp; 'জীবনের মানে?': '42',
& Nbsp; 'চার EvolveMinimumSubscriber খুব অলস, কারণ আপনার আবেদন এটি ব্যবহার করতে পারেন, তাই এটি কেবল মাত্র যথেষ্ট ডাটাবেস আপডেট (minimum_generation, যে হয়). প্রকৃতপক্ষে, মার্কার ডাটাবেস প্রজন্মের 1 bumped করা হয়েছে যে নির্দেশ করে:
& Nbsp; >>> রুট [generations_key] ['some.app']
& Nbsp; 1
আমরা প্রজন্মের জন্য কাজ করছেন দেখতে, তাই আমরা এর নিজে এই কাজ করা যেতে পারে দেখা যাক কিভাবে পরবর্তী পদক্ষেপ গ্রহণ করা এবং প্রজন্মের 2 অভিব্যক্ত সিদ্ধান্ত:
& Nbsp; >>> zope.generations.generations অভিব্যক্ত আমদানি থেকে
& Nbsp; >>> (ডিবি) অভিব্যক্ত
& Nbsp; >>> pprint (root পরিচয়ে ['উত্তর'])
& Nbsp; {'হ্যালো': 'হাই ও আপনি কিভাবে করব?',
& Nbsp; 'জীবনের মানে?': '42',
& Nbsp; 'চার & Nbsp; >>> রুট [generations_key] ['some.app']
& Nbsp; 2
SchemaManager দ্বারা উপলব্ধ সর্বশেষ প্রজন্মের অভিব্যক্ত আপগ্রেড ডিফল্ট আচরণ. আপনি আপডেট করতে হবে অথবা যদি আপনি আমরা পূর্বে বলা হয়েছে, যা গ্রাহক মত অলস হতে চান, তাহলে শুধু মাত্র চেক করতে চান, যখন আপনি) (অভিব্যক্ত কিভাবে যুক্তি ব্যবহার করতে পারেন.
স্কিমা পরিচালকদের ক্রমানুসার
প্রায়ই সঠিকভাবে কাজ করার জন্য অন্যান্য সাব উপর নির্ভর করে একটি আবেদন রচনা করার জন্য ব্যবহার করা সাব. উভয় সাব স্কিমা পরিচালকদের প্রদান করা হলে, এটি Evolvers আহবান করা হবে যা করার জানতে প্রায়ই সহায়ক. এটি একটি কাঠামো করতে পারবেন এবং এটি ক্লায়েন্ট কনসার্টের মধ্যে অভিব্যক্ত পাবে, এবং ক্লায়েন্ট কাঠামো আগে বা নিজেই পরে প্রসূত করা হবে জানতে পারেন.
এই স্কিমা ম্যানেজার ইউটিলিটি নাম নিয়ন্ত্রণ করা সম্ভব. স্কিমা পরিচালকদের তাদের নাম বাছাই করে নির্ধারিত যাতে চালানো হয়.
& Nbsp; >>> manager1 = SchemaManager (minimum_generation = 0, প্রজন্মের = 0)
& Nbsp; >>> manager2 = SchemaManager (minimum_generation = 0, প্রজন্মের = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, নাম = 'another.app')
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager2, ISchemaManager, নাম = 'another.app এক্সটেনশন')
প্রথম প্যাকেজের নাম নির্ভরশীল প্যাকেজ একটি নামস্থান তৈরি করতে ব্যবহার করা হয় কিভাবে লক্ষ্য করুন. এই কাঠামো প্রয়োজন, কিন্তু এই ব্যবহারের জন্য একটি সুবিধাজনক প্যাটার্ন হয় না.
এর এই প্রজন্মের স্থাপন করা ডাটাবেস অভিব্যক্ত করা যাক:
& Nbsp; >>> ঘটনা = DatabaseOpenedEventStub (ডিবি)
& Nbsp; >>> evolveMinimumSubscriber (ইভেন্ট)
& Nbsp; >>> রুট [generations_key] ['another.app']
& Nbsp; 0
& Nbsp; >>> রুট [generations_key] ['another.app এক্সটেনশন']
& Nbsp; 0
এর কিছু কারণ জন্য এই সাব-প্রতিটি একটি প্রজন্মের যুক্ত করার প্রয়োজন, এবং 'another.app এক্সটেনশন' যে প্রজন্মের 1 'another.app' প্রজন্মের 1 উপর নির্ভর করে যে অনুমান করা যাক. আমরা কি তারা তাই আমরা এর ফলে যাচাই করতে পারেন চালানো করছি যে প্রতিটি যে রেকর্ডের জন্য স্কিমা পরিচালকদের প্রদান করতে হবে:
& Nbsp; >>> gsm.unregisterUtility (সরবরাহ = ISchemaManager, নাম = 'another.app')
& Nbsp; সত্য
& Nbsp; >>> gsm.unregisterUtility (
& Nbsp; ... দেওয়া = ISchemaManager, নাম = 'another.app এক্সটেনশন')
& Nbsp; সত্য
& Nbsp; >>> বর্গ FoundationSchemaManager (বস্তু):
& Nbsp; ... কার্যকরী (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... প্রজন্মের = 1
& Nbsp; ...
& Nbsp; ... Def (স্ব, কনটেক্সট, প্রজন্মের) বিকশিত:
& Nbsp; ... রুট = context.connection.root ()
& Nbsp; ... ক্রম = root.get ('ক্রম', [])
& Nbsp; ... যদি প্রজন্মের == 1:
& Nbsp; ... ordering.append ('ভিত্তি 1)
& Nbsp; ... মুদ্রণ 'ফাউন্ডেশন প্রজন্মের 1'
& Nbsp; ... অন্য:
& Nbsp; ... ("অকর্মা") শাহো লিখেছেন বাড়াতে
& Nbsp; ... রুট ['ক্রম'] = ক্রম # পিং অধ্যবসায়
& Nbsp; ... transaction.commit ()
& Nbsp; >>> বর্গ DependentSchemaManager (বস্তু):
& Nbsp; ... কার্যকরী (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... প্রজন্মের = 1
& Nbsp; ...
& Nbsp; ... Def (স্ব, কনটেক্সট, প্রজন্মের) বিকশিত:
& Nbsp; ... রুট = context.connection.root ()
& Nbsp; ... ক্রম = root.get ('ক্রম', [])
& Nbsp; ... যদি প্রজন্মের == 1:
& Nbsp; ... ordering.append ('নির্ভরশীল 1)
& Nbsp; ... মুদ্রণ 'নির্ভরশীল প্রজন্মের 1'
& Nbsp; ... অন্য:
& Nbsp; ... ("অকর্মা") শাহো লিখেছেন বাড়াতে
& Nbsp; ... রুট ['ক্রম'] = ক্রম # পিং অধ্যবসায়
& Nbsp; ... transaction.commit ()
& Nbsp; >>> manager1 = FoundationSchemaManager ()
& Nbsp; >>> manager2 = DependentSchemaManager ()
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, নাম = 'another.app')
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager2, ISchemaManager, নাম = 'another.app এক্সটেনশন')
সবসময় উদ্ভাবক Evolver 'another.app এক্সটেনশন' এর আগে 'another.app' চালানো হবে এখন ডাটাবেসের নব্য:
& Nbsp; >>> ঘটনা = DatabaseOpenedEventStub (ডিবি)
& Nbsp; >>> evolveMinimumSubscriber (ইভেন্ট)
& Nbsp; ভিত্তি প্রজন্মের 1
& Nbsp; নির্ভরশীল প্রজন্মের 1
& Nbsp; >>> রুট ['ক্রম']
& Nbsp; ['ভিত্তি 1', 'নির্ভরশীল 1']
সংস্থাপনা
উপরোক্ত উদাহরণে, আমরা নিজে উত্তর সক্রিয়া. আমরা নিজে যে কাজ করতে হবে না. আবেদন স্বয়ংক্রিয়ভাবে যে কাজ করতে সক্ষম হতে হবে.
IInstallableSchemaManager একটি অ্যাপ্লিকেশন এর একটি ইনিশিয়াল ইনস্টলেশন জন্য একটি ইনস্টলেশনের পদ্ধতি প্রদান, ISchemaManager প্রসারিত করে. এই ডাটাবেস খোলা গ্রাহকদের নিবন্ধনের চেয়ে ভাল বিকল্প.
এর ইনস্টলেশন অন্তর্ভুক্ত একটি নতুন স্কিমা ম্যানেজার নির্ধারণ করা যাক:
& Nbsp; >>> gsm.unregisterUtility (সরবরাহ = ISchemaManager, নাম = 'some.app')
& Nbsp; সত্য
& Nbsp; >>> zope.generations.interfaces IInstallableSchemaManager আমদানি থেকে
& Nbsp; >>> বর্গ MySchemaManager (বস্তু):
& Nbsp; ... কার্যকরী (IInstallableSchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... প্রজন্মের = 2
& Nbsp; ...
& Nbsp; ... Def ইনস্টল করুন (স্ব, কনটেক্সট):
& Nbsp; ... রুট = context.connection.root ()
& Nbsp; ... রুট ['উত্তর'] = {'হ্যালো': 'হাই ও আপনি কিভাবে করব',
& Nbsp; ... '? জীবনের অর্থ': '42',
& Nbsp; ... 'চার & Nbsp; ... transaction.commit ()
& Nbsp; ...
& Nbsp; ... Def (স্ব, কনটেক্সট, প্রজন্মের) বিকশিত:
& Nbsp; ... রুট = context.connection.root ()
& Nbsp; ... উত্তর = রুট ['উত্তর']
& Nbsp; ... যদি প্রজন্মের == 1:
& Nbsp; ... প্রশ্নের জন্য, answers.items উত্তর: ()
& Nbsp; ... উত্তর [প্রশ্ন] = cgi.escape (উত্তর)
& Nbsp; ... Elif প্রজন্মের == 2:
& Nbsp; ... প্রশ্নের জন্য, answers.items উত্তর: ()
& Nbsp; ... দেল উত্তর [প্রশ্ন]
& Nbsp; ... উত্তর [cgi.escape (প্রশ্ন)] = উত্তর
& Nbsp; ... অন্য:
& Nbsp; ... ("অকর্মা") শাহো লিখেছেন বাড়াতে
& Nbsp; ... রুট ['উত্তর'] উত্তর # পিং অধ্যবসায় =
& Nbsp; ... transaction.commit ()
& Nbsp; >>> পরিচালক = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (ম্যানেজার, ISchemaManager, নাম = 'some.app')
এখন, একটি নতুন ডাটাবেস খুলুন:
& Nbsp; >>> db.close ()
& Nbsp; >>> ডিবি = ডিবি ()
& Nbsp; >>> Conn = db.open ()
& Nbsp; conn.root মধ্যে >>> 'উত্তর' ()
& Nbsp; মিথ্যা
& Nbsp; >>> ঘটনা = DatabaseOpenedEventStub (ডিবি)
& Nbsp; >>> evolveMinimumSubscriber (ইভেন্ট)
& Nbsp; >>> conn.sync ()
& Nbsp; >>> রুট = conn.root ()
& Nbsp; >>> pprint (root পরিচয়ে ['উত্তর'])
& Nbsp; {'হ্যালো': 'হাই ও আপনি কিভাবে করব?',
& Nbsp; 'জীবনের মানে?': '42',
& Nbsp; 'চার & Nbsp; >>> রুট [generations_key] ['some.app']
& Nbsp; 2
ZODB লগ আমাদের ইনস্টল স্ক্রিপ্ট মৃত্যুদন্ড কার্যকর করা হয় বলছেন যে
& Nbsp; >>> [. Conn.db এটি জন্য it.description () storage.iterator ()] [- 2]
& Nbsp; u'some.app: 'প্রজন্মের ইনস্টল চলমান

নতুন কি <(ক্ষুদ্র নোট: MySchemaManager এক সঞ্চালিত হবে, এবং evolveMinimumSubscriber দ্বিতীয় এক সঞ্চালিত MySchemaManager সত্যিই কমিট করার দরকার হয় না: দুই করে আছে, কারণ এটি গত রেকর্ড না..) এই রিলিজে> / শক্তিশালী.

  • পাইথন 3.3 জন্য সমর্থন যোগ করা হয়েছে

  • সমতুল্য zope.interface.implementer প্রসাধক সঙ্গে
  • অবচিত প্রতিস্থাপিত zope.interface.implements ব্যবহার.
  • পাইথন 2.4 এবং 2.5 সমর্থন তুলে.

সংস্করণ 3.7.1 নতুন কি

    উন্নয়ন সময় ব্যবহৃত কিন্তু না করা হয়, যা
  • সরানো buildout অংশ উইন্ডোজ কম্পাইল না.
  • জেনারেশন স্ক্রিপ্ট লেনদেন নোট যোগ করুন.

আবশ্যক

  • পাইথন

বিকাশকারী অন্যান্য সফ্টওয়্যার Zope Corporation and Contributors

মন্তব্য zope.generations

পাওয়া মন্তব্যসমূহ না
মন্তব্য যোগ করুন
ছবি চালু!