From f4fb3f9460f82e83853334a771388925b23e7f5f Mon Sep 17 00:00:00 2001 From: Emanuel Schuetze Date: Mon, 7 Dec 2015 20:43:22 +0100 Subject: [PATCH] Remove old unused win32 portable and gui code. Moved to new repositories: https://github.com/OpenSlides/openslides-portable https://github.com/OpenSlides/openslides-gui --- extras/openslides_gui/__init__.py | 0 extras/openslides_gui/__main__.py | 4 - .../data/openslides-logo_wide.png | Bin 7340 -> 0 bytes extras/openslides_gui/data/openslides.ico | Bin 22382 -> 0 bytes extras/openslides_gui/gui.py | 756 ------------------ extras/win32-portable/create_portable.txt | 38 - extras/win32-portable/install-requirements.py | 12 - .../licenses/backports.ssl_match_hostname | 51 -- extras/win32-portable/licenses/beautifulsoup4 | 26 - extras/win32-portable/licenses/django | 27 - .../win32-portable/licenses/django-ckeditor | 24 - .../win32-portable/licenses/django-haystack | 31 - extras/win32-portable/licenses/django-mptt | 18 - extras/win32-portable/licenses/html5lib | 20 - extras/win32-portable/licenses/jsonfield | 20 - extras/win32-portable/licenses/natsort | 19 - extras/win32-portable/licenses/openslides | 21 - extras/win32-portable/licenses/reportlab | 29 - extras/win32-portable/licenses/six | 18 - extras/win32-portable/licenses/sockjs-tornado | 19 - extras/win32-portable/licenses/tornado | 4 - extras/win32-portable/licenses/whoosh | 26 - extras/win32-portable/licenses/wxpython | 46 -- extras/win32-portable/openslides.c | 212 ----- extras/win32-portable/openslides.exe | Bin 32256 -> 0 bytes extras/win32-portable/prepare_portable.py | 542 ------------- 26 files changed, 1963 deletions(-) delete mode 100644 extras/openslides_gui/__init__.py delete mode 100644 extras/openslides_gui/__main__.py delete mode 100644 extras/openslides_gui/data/openslides-logo_wide.png delete mode 100644 extras/openslides_gui/data/openslides.ico delete mode 100644 extras/openslides_gui/gui.py delete mode 100644 extras/win32-portable/create_portable.txt delete mode 100644 extras/win32-portable/install-requirements.py delete mode 100644 extras/win32-portable/licenses/backports.ssl_match_hostname delete mode 100644 extras/win32-portable/licenses/beautifulsoup4 delete mode 100644 extras/win32-portable/licenses/django delete mode 100644 extras/win32-portable/licenses/django-ckeditor delete mode 100644 extras/win32-portable/licenses/django-haystack delete mode 100644 extras/win32-portable/licenses/django-mptt delete mode 100644 extras/win32-portable/licenses/html5lib delete mode 100644 extras/win32-portable/licenses/jsonfield delete mode 100644 extras/win32-portable/licenses/natsort delete mode 100644 extras/win32-portable/licenses/openslides delete mode 100644 extras/win32-portable/licenses/reportlab delete mode 100644 extras/win32-portable/licenses/six delete mode 100644 extras/win32-portable/licenses/sockjs-tornado delete mode 100644 extras/win32-portable/licenses/tornado delete mode 100644 extras/win32-portable/licenses/whoosh delete mode 100644 extras/win32-portable/licenses/wxpython delete mode 100644 extras/win32-portable/openslides.c delete mode 100644 extras/win32-portable/openslides.exe delete mode 100755 extras/win32-portable/prepare_portable.py diff --git a/extras/openslides_gui/__init__.py b/extras/openslides_gui/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/extras/openslides_gui/__main__.py b/extras/openslides_gui/__main__.py deleted file mode 100644 index 14932bed3..000000000 --- a/extras/openslides_gui/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .gui import main - -if __name__ == "__main__": - main() diff --git a/extras/openslides_gui/data/openslides-logo_wide.png b/extras/openslides_gui/data/openslides-logo_wide.png deleted file mode 100644 index d46f12df86aee31c6a4997862db0ebf8d31d96bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7340 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 B*)sqD diff --git a/extras/openslides_gui/data/openslides.ico b/extras/openslides_gui/data/openslides.ico deleted file mode 100644 index 0f562a295cbe197710b0b75df32b76ba341f533d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22382 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 10: - break - - if not is_alive: - exitcode = self.child_process.returncode - self.update_timer.Stop() - self.child_process = None - - evt = RunCmdEvent(EVT_RUN_CMD_ID, self.GetId()) - evt.running = False - evt.exitcode = exitcode - self.GetEventHandler().ProcessEvent(evt) - - def append_message(self, text, newline="\n"): - with self.output_mutex: - self.te_output.AppendText(text + newline) - - -class SettingsDialog(wx.Dialog): - def __init__(self, parent): - super(SettingsDialog, self).__init__(parent, wx.ID_ANY, _("Settings")) - - grid = wx.GridBagSizer(5, 5) - row = 0 - - lb_host = wx.StaticText(self, label=_("&Host:")) - grid.Add(lb_host, pos=(row, 0)) - self.tc_host = wx.TextCtrl(self) - grid.Add(self.tc_host, pos=(row, 1), flag=wx.EXPAND) - - row += 1 - - lb_port = wx.StaticText(self, label=_("&Port:")) - grid.Add(lb_port, pos=(row, 0)) - self.tc_port = wx.TextCtrl(self) - grid.Add(self.tc_port, pos=(row, 1), flag=wx.EXPAND) - - row += 1 - - sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL) - if not sizer is None: - grid.Add((0, 0), pos=(row, 0), span=(1, 2)) - row += 1 - grid.Add(sizer, pos=(row, 0), span=(1, 2)) - - box = wx.BoxSizer(wx.VERTICAL) - box.Add( - grid, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_VERTICAL, - border=5, proportion=1) - - self.SetSizerAndFit(box) - - @property - def host(self): - return self.tc_host.GetValue() - - @host.setter - def host(self, host): - self.tc_host.SetValue(host) - - @property - def port(self): - return self.tc_port.GetValue() - - @port.setter - def port(self, port): - self.tc_port.SetValue(port) - - -class BackupSettingsDialog(wx.Dialog): - # NOTE: keep order in sync with _update_interval_choices() - _INTERVAL_UNITS = ["second", "minute", "hour"] - - def __init__(self, parent): - super(BackupSettingsDialog, self).__init__( - parent, wx.ID_ANY, _("Database backup")) - - self._interval_units = {} - - grid = wx.GridBagSizer(5, 5) - row = 0 - - self.cb_backup = wx.CheckBox( - self, label=_("&Regularly backup database")) - self.cb_backup.SetValue(True) - self.cb_backup.Bind(wx.EVT_CHECKBOX, self.on_backup_checked) - grid.Add(self.cb_backup, pos=(row, 0), span=(1, 3)) - row += 1 - - lb_dest = wx.StaticText(self, label=_("&Destination:")) - grid.Add(lb_dest, pos=(row, 0)) - style = wx.FLP_SAVE | wx.FLP_USE_TEXTCTRL - self.fp_dest = wx.FilePickerCtrl(self, style=style) - grid.Add(self.fp_dest, pos=(row, 1), span=(1, 2), flag=wx.EXPAND) - row += 1 - - lb_interval = wx.StaticText(self, label=_("&Every")) - grid.Add(lb_interval, pos=(row, 0)) - self.sb_interval = wx.SpinCtrl(self, min=1, initial=1) - self.sb_interval.Bind(wx.EVT_SPINCTRL, self.on_interval_changed) - grid.Add(self.sb_interval, pos=(row, 1)) - self.ch_interval_unit = wx.Choice(self) - grid.Add(self.ch_interval_unit, pos=(row, 2)) - row += 1 - - grid.AddGrowableCol(1) - - sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL) - if not sizer is None: - grid.Add((0, 0), pos=(row, 0), span=(1, 3)) - row += 1 - grid.Add(sizer, pos=(row, 0), span=(1, 3)) - - box = wx.BoxSizer(wx.VERTICAL) - box.Add( - grid, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_VERTICAL, - border=5, proportion=1) - - self.SetSizerAndFit(box) - self._update_interval_choices() - self._update_backup_enabled() - - @property - def backupdb_enabled(self): - return self.cb_backup.GetValue() - - @backupdb_enabled.setter - def backupdb_enabled(self, enabled): - self.cb_backup.SetValue(enabled) - self._update_backup_enabled() - - @property - def backupdb_destination(self): - return self.fp_dest.GetPath() - - @backupdb_destination.setter - def backupdb_destination(self, path): - self.fp_dest.SetPath(path) - - @property - def interval(self): - return self.sb_interval.GetValue() - - @interval.setter - def interval(self, value): - self.sb_interval.SetValue(value) - self._update_interval_choices() - - @property - def interval_unit(self): - return self._INTERVAL_UNITS[self.ch_interval_unit.GetSelection()] - - @interval_unit.setter - def interval_unit(self, unit): - try: - idx = self._INTERVAL_UNITS.index(unit) - except IndexError: - raise ValueError("Unknown unit {0}".format(unit)) - - self.ch_interval_unit.SetSelection(idx) - - def _update_interval_choices(self): - count = self.sb_interval.GetValue() - choices = [ - ungettext("second", "seconds", count), - ungettext("minute", "minutes", count), - ungettext("hour", "hours", count), - ] - - current = self.ch_interval_unit.GetSelection() - if current == wx.NOT_FOUND: - current = 2 # default to hour - - self.ch_interval_unit.Clear() - self.ch_interval_unit.AppendItems(choices) - self.ch_interval_unit.SetSelection(current) - - def _update_backup_enabled(self): - checked = self.cb_backup.IsChecked() - self.fp_dest.Enable(checked) - self.sb_interval.Enable(checked) - self.ch_interval_unit.Enable(checked) - - def on_backup_checked(self, evt): - self._update_backup_enabled() - - def on_interval_changed(self, evt): - self._update_interval_choices() - - # TODO: validate settings on close (e.g. non-empty path if backup is - # enabled) - - -class MainWindow(wx.Frame): - def __init__(self, parent=None): - super(MainWindow, self).__init__(parent, title="OpenSlides") - icons = wx.IconBundleFromFile( - get_data_path("openslides.ico"), - wx.BITMAP_TYPE_ICO) - self.SetIcons(icons) - - self.server_running = False - - self.gui_settings_path = None - self.gui_initialized = False - - self.backupdb_enabled = False - self.backupdb_destination = "" - self.backupdb_interval = 15 - self.backupdb_interval_unit = "minute" - self.last_backup = None - - self.backup_timer = wx.Timer(self) - self.Bind(wx.EVT_TIMER, self.on_backup_timer, self.backup_timer) - - spacing = 5 - - panel = wx.Panel(self) - grid = wx.GridBagSizer(spacing, spacing) - - # logo & about button - logo_box = wx.BoxSizer(wx.HORIZONTAL) - grid.Add(logo_box, pos=(0, 0), flag=wx.EXPAND) - row = 0 - - fp = get_data_path("openslides-logo_wide.png") - with open(fp, "rb") as f: - logo_wide_bmp = wx.ImageFromStream(f).ConvertToBitmap() - - logo_wide = wx.StaticBitmap(panel, wx.ID_ANY, logo_wide_bmp) - logo_box.AddSpacer(2 * spacing) - logo_box.Add(logo_wide) - logo_box.AddStretchSpacer() - - version_str = _("Version {0}").format(openslides.get_version()) - lb_version = wx.StaticText(panel, label=version_str) - font = lb_version.GetFont() - font.SetPointSize(8) - lb_version.SetFont(font) - logo_box.Add(lb_version, flag=wx.ALIGN_CENTER_VERTICAL) - - self.bt_about = wx.Button(panel, label=_("&About...")) - self.bt_about.Bind(wx.EVT_BUTTON, self.on_about_clicked) - grid.Add(self.bt_about, pos=(row, 1), flag=wx.ALIGN_CENTER_VERTICAL) - row += 1 - - grid.Add((0, spacing), pos=(row, 0), span=(1, 2)) - row += 1 - - # server settings - server_settings = wx.StaticBox(panel, wx.ID_ANY, _("Server Settings")) - server_box = wx.StaticBoxSizer(server_settings, wx.VERTICAL) - grid.Add(server_box, pos=(row, 0), flag=wx.EXPAND) - - self._host = None - self._port = None - hbox = wx.BoxSizer(wx.HORIZONTAL) - server_box.Add(hbox, flag=wx.EXPAND) - self.lb_host = wx.StaticText(panel) - hbox.Add(self.lb_host, flag=wx.ALIGN_CENTER_VERTICAL) - hbox.AddStretchSpacer() - self.lb_port = wx.StaticText(panel) - hbox.Add(self.lb_port, flag=wx.ALIGN_CENTER_VERTICAL) - hbox.AddStretchSpacer() - self.bt_settings = wx.Button(panel, label=_("S&ettings...")) - self.bt_settings.Bind(wx.EVT_BUTTON, self.on_settings_clicked) - hbox.Add(self.bt_settings) - - server_box.AddSpacer(spacing) - self.cb_start_browser = wx.CheckBox( - panel, label=_("Automatically open &browser")) - self.cb_start_browser.SetValue(True) - server_box.Add(self.cb_start_browser) - server_box.AddStretchSpacer() - - server_box.AddSpacer(spacing) - self.bt_server = wx.Button(panel, label=_("&Start server")) - self.bt_server.Bind(wx.EVT_BUTTON, self.on_start_server_clicked) - server_box.Add(self.bt_server, flag=wx.EXPAND) - - self.host = "0.0.0.0" - self.port = unicode(get_port(self.host, 80)) - - # "action" buttons - action_vbox = wx.BoxSizer(wx.VERTICAL) - action_vbox.AddSpacer(3 * spacing) - grid.Add(action_vbox, pos=(row, 1)) - self.bt_backup = wx.Button(panel, label=_("&Backup database...")) - self.bt_backup.Bind(wx.EVT_BUTTON, self.on_backup_clicked) - action_vbox.Add(self.bt_backup) - action_vbox.AddSpacer(spacing) - self.bt_sync_db = wx.Button(panel, label=_("S&ync database")) - self.bt_sync_db.Bind(wx.EVT_BUTTON, self.on_syncdb_clicked) - action_vbox.Add(self.bt_sync_db) - action_vbox.AddSpacer(spacing) - self.bt_reset_admin = wx.Button(panel, label=_("&Reset admin")) - self.bt_reset_admin.Bind(wx.EVT_BUTTON, self.on_reset_admin_clicked) - action_vbox.Add(self.bt_reset_admin) - row += 1 - - # command output - self.cmd_run_ctrl = RunCommandControl(panel) - self.cmd_run_ctrl.Bind(EVT_RUN_CMD, self.on_run_cmd_changed) - grid.Add( - self.cmd_run_ctrl, - pos=(row, 0), span=(1, 2), - flag=wx.EXPAND) - - grid.AddGrowableCol(0) - grid.AddGrowableRow(3) - - box = wx.BoxSizer(wx.VERTICAL) - box.Add( - grid, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_VERTICAL, - border=spacing, proportion=1) - panel.SetSizerAndFit(box) - self.Fit() - self.SetMinSize(self.ClientToWindowSize(box.GetMinSize())) - self.SetInitialSize(wx.Size(500, 400)) - - self.Bind(wx.EVT_CLOSE, self.on_close) - - def initialize_gui(self): - if self.gui_initialized: - return True - - # Set path for gui settings to default user data according to the - # OpenSlides type. This does not depend on any argument the user might - # type in. - openslides_type = detect_openslides_type() - try: - default_user_data_path = get_default_user_data_path(openslides_type) - except PortableDirNotWritable: - wx.MessageBox( - _("The portable directory is not writable. Please copy the " - "openslides portable to a writeable location and start it " - "again from there"), - _("Error: Portable directory not writable"), - wx.OK | wx.ICON_ERROR) - return False - - self.gui_settings_path = os.path.join( - default_user_data_path, 'openslides', 'gui_settings.json') - self.load_gui_settings() - self.apply_backup_settings() - - self.gui_initialized = True - return True - - @property - def backup_interval_seconds(self): - if self.backupdb_interval_unit == "second": - factor = 1 - elif self.backupdb_interval_unit == "minute": - factor = 60 - elif self.backupdb_interval_unit == "hour": - factor = 3600 - - return self.backupdb_interval * factor - - @property - def host(self): - return self._host - - @host.setter - def host(self, host): - self._host = host - self.lb_host.SetLabel(_("Host: {0}").format(host)) - - @property - def port(self): - return self._port - - @port.setter - def port(self, port): - self._port = port - self.lb_port.SetLabel(_("Port: {0}").format(port)) - - def load_gui_settings(self): - if self.gui_settings_path is None: - return - - try: - f = open(self.gui_settings_path, "rb") - except IOError as e: - if e.errno == errno.ENOENT: - return - raise - - with f: - settings = json.load(f) - - def setattr_unless_none(attr, value): - if not value is None: - setattr(self, attr, value) - - backup_settings = settings.get("database_backup", {}) - setattr_unless_none("backupdb_enabled", backup_settings.get("enabled")) - setattr_unless_none( - "backupdb_destination", backup_settings.get("destination")) - setattr_unless_none( - "backupdb_interval", backup_settings.get("interval")) - setattr_unless_none( - "backupdb_interval_unit", backup_settings.get("interval_unit")) - last_backup = backup_settings.get("last_backup") - if not last_backup is None: - self.last_backup = datetime.datetime.strptime( - last_backup, "%Y-%m-%d %H:%M:%S") - server_settings = settings.get("server_settings", {}) - setattr_unless_none("host", server_settings.get("host")) - setattr_unless_none("port", server_settings.get("port")) - - def save_gui_settings(self): - if self.last_backup is None: - last_backup = None - else: - last_backup = self.last_backup.strftime("%Y-%m-%d %H:%M:%S") - settings = { - "database_backup": { - "enabled": self.backupdb_enabled, - "destination": self.backupdb_destination, - "internal": self.backupdb_interval, - "interval_unit": self.backupdb_interval_unit, - "last_backup": last_backup - }, - "server_settings": { - "host": self.host, - "port": self.port, - }, - } - - dp = os.path.dirname(self.gui_settings_path) - if not os.path.exists(dp): - os.makedirs(dp) - with open(self.gui_settings_path, "wb") as f: - json.dump(settings, f, ensure_ascii=False, indent=4) - - def apply_backup_settings(self): - if self.backupdb_enabled and self.server_running: - now = datetime.datetime.utcnow() - delta = datetime.timedelta(seconds=self.backup_interval_seconds) - ref = self.last_backup - if ref is None: - ref = now - ref += delta - - d = ref - now - seconds = d.days * 86400 + d.seconds - if seconds < 1: - seconds = 30 # avoid backup immediatly after start - self.backup_timer.Start(seconds * 1000, True) - else: - self.backup_timer.Stop() - - def do_backup(self): - cmd = [ - sys.executable, "-u", "-m", "openslides", "backupdb", - self.backupdb_destination, - ] - p = subprocess.Popen( - cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - p.stdin.close() - output = p.stdout.read().strip() - exitcode = p.wait() - if output: - self.cmd_run_ctrl.append_message(output) - - time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - if exitcode == 0: - self.cmd_run_ctrl.append_message( - _("{0}: Database backup successful.").format(time)) - else: - self.cmd_run_ctrl.append_message( - _("{0}: Database backup failed!").format(time)) - - self.last_backup = datetime.datetime.utcnow() - - def on_syncdb_clicked(self, evt): - self.cmd_run_ctrl.append_message(_("Syncing database...")) - self.cmd_run_ctrl.run_command("syncdb") - - def on_reset_admin_clicked(self, evt): - self.cmd_run_ctrl.append_message(_("Resetting admin user...")) - self.cmd_run_ctrl.run_command("createsuperuser") - - def on_about_clicked(self, evt): - info = wx.AboutDialogInfo() - info.SetName("OpenSlides") - info.SetVersion(openslides.get_version()) - info.SetDescription(_( - "OpenSlides is a free web based presentation and " - "assembly system.\n" - "OpenSlides is free software; licensed under the MIT license." - ).replace(u" ", u"\u00a0")) - info.SetCopyright(_(u"\u00a9 2011-2015 by OpenSlides team")) - info.SetWebSite(("http://www.openslides.org/", "www.openslides.org")) - - # XXX: at least on wxgtk this has no effect - info.SetIcon(self.GetIcon()) - wx.AboutBox(info) - - def on_start_server_clicked(self, evt): - if self.server_running: - self.cmd_run_ctrl.cancel_command() - return - - if self._host == "0.0.0.0": - args = ["--port", self._port] - else: - args = ["--address", self._host, "--port", self._port] - - if not self.cb_start_browser.GetValue(): - args.append("--no-browser") - - self.server_running = True - self.cmd_run_ctrl.run_command("start", *args) - - # initiate backup_timer if backup is enabled - self.apply_backup_settings() - - self.bt_server.SetLabel(_("&Stop server")) - - def on_settings_clicked(self, evt): - dlg = SettingsDialog(self) - dlg.host = self._host - dlg.port = self._port - - if dlg.ShowModal() == wx.ID_OK: - self.host = dlg.host - self.port = dlg.port - - def on_backup_clicked(self, evt): - dlg = BackupSettingsDialog(self) - dlg.backupdb_enabled = self.backupdb_enabled - dlg.backupdb_destination = self.backupdb_destination - dlg.interval = self.backupdb_interval - dlg.interval_unit = self.backupdb_interval_unit - if dlg.ShowModal() == wx.ID_OK: - self.backupdb_enabled = dlg.backupdb_enabled - self.backupdb_destination = dlg.backupdb_destination - self.backupdb_interval = dlg.interval - self.backupdb_interval_unit = dlg.interval_unit - self.apply_backup_settings() - - def on_run_cmd_changed(self, evt): - show_completion_msg = not evt.running - if self.server_running and not evt.running: - self.bt_server.SetLabel(_("&Start server")) - self.server_running = False - - self.backup_timer.Stop() - if self.backupdb_enabled: - self.do_backup() - - # no operation completed msg when stopping server - show_completion_msg = False - - self.bt_settings.Enable(not evt.running) - self.bt_backup.Enable(not evt.running) - self.bt_sync_db.Enable(not evt.running) - self.bt_reset_admin.Enable(not evt.running) - self.bt_server.Enable(self.server_running or not evt.running) - - if show_completion_msg: - if evt.exitcode == 0: - text = _("Operation successfully completed.") - else: - text = _("Operation failed (exit code = {0})").format( - evt.exitcode) - self.cmd_run_ctrl.append_message(text) - - def on_backup_timer(self, evt): - if not self.backupdb_enabled: - return - - self.do_backup() - self.backup_timer.Start(1000 * self.backup_interval_seconds, True) - - def on_close(self, ev): - self.cmd_run_ctrl.cancel_command() - self.save_gui_settings() - self.Destroy() - -class OpenslidesApp(wx.App): - def __init__(self): - super(OpenslidesApp, self).__init__(False) - - def OnInit(self): - window = MainWindow() - self.SetTopWindow(window) - - if not window.initialize_gui(): - self.Exit() - return False - - window.Show() - return True - -def main(): - locale.setlocale(locale.LC_ALL, "") - lang = locale.getdefaultlocale()[0] - if lang: - global _translations - localedir = filesystem2unicode(openslides.__file__) - localedir = os.path.dirname(localedir) - localedir = os.path.join(localedir, "locale") - _translations = gettext.translation( - "django", localedir, [lang], fallback=True) - - app = OpenslidesApp() - app.MainLoop() - -if __name__ == "__main__": - main() diff --git a/extras/win32-portable/create_portable.txt b/extras/win32-portable/create_portable.txt deleted file mode 100644 index a7138c19b..000000000 --- a/extras/win32-portable/create_portable.txt +++ /dev/null @@ -1,38 +0,0 @@ -How to create a new portable Windows distribution of OpenSlides: ----------------------------------------------------------------- - -1. Install Python 2.7.x and Setuptools - Follow the instructions in the README, section III (Windows installation), step 1. - - -2. Install all required python packages from requirements_production.txt: - (Note: You have to use 'easy_install -Z $PACKAGENAME') - - python install-requirements.py - - -3. Install pywin32 from binary installer: - http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe/download - - Pywin32 is used to update the version resource of the prebuild openslides.exe. - It is not strictly required but at least for published releases it is highly advisable. - - -4. Install wxPython from binary installer: - http://sourceforge.net/projects/wxpython/files/wxPython/2.8.12.1/wxPython2.8-win32-unicode-2.8.12.1-py27.exe/download - - WxPython is required to build the OpenSlides GUI frontend. - - -5. Run in the main directory of the OpenSlides checkout: - - python extras\win32-portable\prepare_portable.py - - -=> The portable OpenSlides distribution is created as a zip archive in - the 'dist' directory of OpenSlides checkout. - - -NOTE: Creating the portable Windows distribution of OpenSlides is not possible -if Python is installed in 64-bit(!) version. - diff --git a/extras/win32-portable/install-requirements.py b/extras/win32-portable/install-requirements.py deleted file mode 100644 index c2dfaa3c2..000000000 --- a/extras/win32-portable/install-requirements.py +++ /dev/null @@ -1,12 +0,0 @@ -import os - -f = open("../../requirements_production.txt") -reqs = f.read().split("\n") - -for req in reqs: - # ignore comments or pip options - if req.startswith('--') or req.startswith('#'): - continue - # ignore blank lines - if len(req) > 0: - os.system('easy_install -Z -U "%s"' % req) diff --git a/extras/win32-portable/licenses/backports.ssl_match_hostname b/extras/win32-portable/licenses/backports.ssl_match_hostname deleted file mode 100644 index 58058f1bb..000000000 --- a/extras/win32-portable/licenses/backports.ssl_match_hostname +++ /dev/null @@ -1,51 +0,0 @@ -Python License (Python-2.0) - -Python License, Version 2 (Python-2.0) - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python -alone or in any derivative version, provided, however, that PSF's -License Agreement and PSF's notice of copyright, i.e., "Copyright (c) -2001-2013 Python Software Foundation; All Rights Reserved" are retained in -Python alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. diff --git a/extras/win32-portable/licenses/beautifulsoup4 b/extras/win32-portable/licenses/beautifulsoup4 deleted file mode 100644 index 8501362df..000000000 --- a/extras/win32-portable/licenses/beautifulsoup4 +++ /dev/null @@ -1,26 +0,0 @@ -Beautiful Soup is made available under the MIT license: - - Copyright (c) 2004-2012 Leonard Richardson - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE, DAMMIT. - -Beautiful Soup incorporates code from the html5lib library, which is -also made available under the MIT license. diff --git a/extras/win32-portable/licenses/django b/extras/win32-portable/licenses/django deleted file mode 100644 index ce8fd060b..000000000 --- a/extras/win32-portable/licenses/django +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Django Software Foundation and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of Django nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/extras/win32-portable/licenses/django-ckeditor b/extras/win32-portable/licenses/django-ckeditor deleted file mode 100644 index fb62af2a2..000000000 --- a/extras/win32-portable/licenses/django-ckeditor +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) Shaun Sephton -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Shaun Sephton nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL SHAUN SEPHTON BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/extras/win32-portable/licenses/django-haystack b/extras/win32-portable/licenses/django-haystack deleted file mode 100644 index f80cad874..000000000 --- a/extras/win32-portable/licenses/django-haystack +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2009-2013, Daniel Lindsley. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of Haystack nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---- - -Prior to April 17, 2009, this software was released under the MIT license. diff --git a/extras/win32-portable/licenses/django-mptt b/extras/win32-portable/licenses/django-mptt deleted file mode 100644 index 686fd1176..000000000 --- a/extras/win32-portable/licenses/django-mptt +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2007, Jonathan Buchanan - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extras/win32-portable/licenses/html5lib b/extras/win32-portable/licenses/html5lib deleted file mode 100644 index 61a275a14..000000000 --- a/extras/win32-portable/licenses/html5lib +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2006-2013 James Graham and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extras/win32-portable/licenses/jsonfield b/extras/win32-portable/licenses/jsonfield deleted file mode 100644 index 46bbd542a..000000000 --- a/extras/win32-portable/licenses/jsonfield +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2012 Brad Jasper - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extras/win32-portable/licenses/natsort b/extras/win32-portable/licenses/natsort deleted file mode 100644 index 993858af2..000000000 --- a/extras/win32-portable/licenses/natsort +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Seth M. Morton - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/extras/win32-portable/licenses/openslides b/extras/win32-portable/licenses/openslides deleted file mode 100644 index 26a03f0ea..000000000 --- a/extras/win32-portable/licenses/openslides +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2011-2015 OpenSlides Team - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/extras/win32-portable/licenses/reportlab b/extras/win32-portable/licenses/reportlab deleted file mode 100644 index e714d0348..000000000 --- a/extras/win32-portable/licenses/reportlab +++ /dev/null @@ -1,29 +0,0 @@ -##################################################################################### -# -# Copyright (c) 2000-2010, ReportLab Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of the company nor the names of its contributors may be -# used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE OFFICERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# -##################################################################################### diff --git a/extras/win32-portable/licenses/six b/extras/win32-portable/licenses/six deleted file mode 100644 index d76e02426..000000000 --- a/extras/win32-portable/licenses/six +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2010-2014 Benjamin Peterson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extras/win32-portable/licenses/sockjs-tornado b/extras/win32-portable/licenses/sockjs-tornado deleted file mode 100644 index 578bbb425..000000000 --- a/extras/win32-portable/licenses/sockjs-tornado +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011 Serge S. Koval - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/extras/win32-portable/licenses/tornado b/extras/win32-portable/licenses/tornado deleted file mode 100644 index 7995af0ef..000000000 --- a/extras/win32-portable/licenses/tornado +++ /dev/null @@ -1,4 +0,0 @@ -Tornado is one of `Facebook's open source technologies -`_. It is available under -the `Apache License, Version 2.0 -`_. diff --git a/extras/win32-portable/licenses/whoosh b/extras/win32-portable/licenses/whoosh deleted file mode 100644 index 81485cb4e..000000000 --- a/extras/win32-portable/licenses/whoosh +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2011 Matt Chaput. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY MATT CHAPUT ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL MATT CHAPUT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are -those of the authors and should not be interpreted as representing official -policies, either expressed or implied, of Matt Chaput. diff --git a/extras/win32-portable/licenses/wxpython b/extras/win32-portable/licenses/wxpython deleted file mode 100644 index a25356ad2..000000000 --- a/extras/win32-portable/licenses/wxpython +++ /dev/null @@ -1,46 +0,0 @@ -The wxWindows Library Licence - -Copyright (c) 1998 Julian Smart, Robert Roebling [, ...] - -Everyone is permitted to copy and distribute verbatim copies of this licence -document, but changing it is not allowed. - -WXWINDOWS LIBRARY LICENCE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND -MODIFICATION - -This library is free software; you can redistribute it and/or modify it under -the terms of the GNU Library General Public Licence as published by the Free -Software Foundation; either version 2 of the Licence, or (at your option) any -later version. - -This library is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Library General Public Licence for more details. - -You should have received a copy of the GNU Library General Public Licence along -with this software, usually in a file named COPYING.LIB. If not, write to the -Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION NOTICE - -1. As a special exception, the copyright holders of this library give permission -for additional uses of the text contained in this release of the library as -licenced under the wxWindows Library Licence, applying either version 3 of the -Licence, or (at your option) any later version of the Licence as published by -the copyright holders of version 3 of the Licence document. - -2. The exception is that you may use, copy, link, modify and distribute under -the user's own terms, binary object code versions of works based on the Library. - -3. If you copy code from files distributed under the terms of the GNU General -Public Licence or the GNU Library General Public Licence into a copy of this -library, as this licence permits, the exception does not apply to the code that -you add in this way. To avoid misleading anyone as to the status of such -modified files, you must delete this exception notice from such code and/or -adjust the licensing conditions notice accordingly. - -4. If you write modifications of your own for this library, it is your choice -whether to permit this exception to apply to your modifications. If you do not -wish that, you must delete the exception notice from such code and/or adjust the -licensing conditions notice accordingly. diff --git a/extras/win32-portable/openslides.c b/extras/win32-portable/openslides.c deleted file mode 100644 index 1eb9c19b1..000000000 --- a/extras/win32-portable/openslides.c +++ /dev/null @@ -1,212 +0,0 @@ -#include -#include -#include - -#define _WIN32_LEAN_AND_MEAN -#include - -#include - -#define PYTHON_DLL_PATH "\\Dlls\\python27.dll" - -static void (*py_initialize)(void) = 0; -static void (*py_finalize)(void) = 0; -static void (*py_set_program_name)(char *) = 0; -static void (*py_set_python_home)(char *) = 0; -static int (*py_run_simple_string_flags)(const char *, PyCompilerFlags *) = 0; -static void (*py_sys_set_argv_ex)(int, char **, int) = 0; -static int (*py_main)(int, char **) = 0; -static int *py_ignore_environment_flag = 0; - -static const char *run_openslides_code = - "import openslides_gui.gui;" - "openslides_gui.gui.main()"; - -/* determine the path to the executable - * NOTE: Py_GetFullProgramPath() can't be used because - * this would trigger pythons search-path initialization - * But we need this to initialize PYTHONHOME before this happens - */ -static char * -_get_module_name() -{ - size_t size = 1; - char *name = NULL; - int i; - - /* a path > 40k would be insane, it is more likely something - * else has gone very wrong on the system - */ - for (i = 0;i < 10; i++) - { - DWORD res; - char *n; - - n = realloc(name, size); - if (!n) - { - free(name); - return NULL; - } - name = n; - - res = GetModuleFileNameA(NULL, name, size); - if (res != 0 && res < size) - { - return name; - } - else if (res == size) - { - /* NOTE: Don't check GetLastError() == ERROR_INSUFFICIENT_BUFFER - * here, it isn't set consistently across all platforms - */ - - size += 4096; - } - else - { - DWORD err = GetLastError(); - fprintf(stderr, "WARNING: GetModuleFileName() failed " - "(res = %d, err = %d)", res, err); - free(name); - return NULL; - - } - } - - return NULL; -} - -static void -_fatal_error(const char *text) -{ - MessageBoxA(NULL, text, "Fatal error", MB_OK | MB_ICONERROR); - exit(1); -} - -static void -_fatal_error_fmt(const char *fmt, ...) -{ - int size = 512; - char *buf = malloc(size); - va_list args; - int bytes_written; - - if (!buf) - abort(); - - va_start(args, fmt); - for (;;) - { - bytes_written = vsnprintf(buf, size, fmt, args); - if (bytes_written > -1 && bytes_written < size) - break; - else if (bytes_written > size) - size = bytes_written + 1; - else - size *= 2; - - buf = realloc(buf, size); - if (!buf) - abort(); - } - va_end(args); - - _fatal_error(buf); -} - -static void * -_load_func(HMODULE module, const char *name) -{ - void *address = GetProcAddress(module, name); - if (!address) - _fatal_error_fmt("Failed to look up symbol %s", name); - return address; -} - -static void -_load_python(const char *pyhome) -{ - size_t pyhome_len = strlen(pyhome); - size_t size = pyhome_len + strlen(PYTHON_DLL_PATH) + 1; - char *buf = malloc(size); - HMODULE py_dll; - - if (!buf) - abort(); - memcpy(buf, pyhome, pyhome_len); - memcpy(buf + pyhome_len, PYTHON_DLL_PATH, sizeof(PYTHON_DLL_PATH)); - buf[size - 1] = '\0'; - - py_dll = LoadLibrary(buf); - if (!py_dll) - { - DWORD error = GetLastError(); - _fatal_error_fmt("Failed to load %s (error %d)", buf, error); - } - - py_initialize = (void (*)(void))_load_func(py_dll, "Py_Initialize"); - py_finalize = (void (*)(void))_load_func(py_dll, "Py_Finalize"); - py_set_program_name = (void (*)(char *)) - _load_func(py_dll, "Py_SetProgramName"); - py_set_python_home = (void (*)(char *)) - _load_func(py_dll, "Py_SetPythonHome"); - py_run_simple_string_flags = (int (*)(const char *, PyCompilerFlags *)) - _load_func(py_dll, "PyRun_SimpleStringFlags"); - py_sys_set_argv_ex = (void (*)(int, char **, int)) - _load_func(py_dll, "PySys_SetArgvEx"); - py_main = (int (*)(int, char **))_load_func(py_dll, "Py_Main"); - py_ignore_environment_flag = (int *) - _load_func(py_dll, "Py_IgnoreEnvironmentFlag"); -} - -static int -_run() -{ - if (py_run_simple_string_flags(run_openslides_code, NULL) != 0) - _fatal_error("Failed to execute openslides"); - - return 0; -} - - -int WINAPI -WinMain(HINSTANCE inst, HINSTANCE prev_inst, LPSTR cmdline, int show) -{ - int returncode; - int run_py_main = __argc > 1; - char *py_home, *sep = NULL; - - py_home = _get_module_name(); - if (!py_home) - _fatal_error("Could not determine portable root directory"); - - sep = strrchr(py_home, '\\'); - /* should always be the true */ - if (sep) - *sep = '\0'; - - _load_python(py_home); - py_set_program_name(__argv[0]); - py_set_python_home(py_home); - *py_ignore_environment_flag = 1; - - if (run_py_main) - { - /* we where given extra arguments, behave like python.exe */ - returncode = py_main(__argc, __argv); - } - else - { - /* no arguments given => start openslides gui */ - py_initialize(); - py_sys_set_argv_ex(__argc, __argv, 0); - - returncode = _run(); - py_finalize(); - } - - free(py_home); - - return returncode; -} diff --git a/extras/win32-portable/openslides.exe b/extras/win32-portable/openslides.exe deleted file mode 100644 index 96fb7ae1f9a10e02bd1bbb13b0500a7b8be0fece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32256 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 - -#define ID_ICO_OPENSLIDES 1 - -ID_ICO_OPENSLIDES ICON "openslides.ico" - -VS_VERSION_INFO VERSIONINFO - FILEVERSION {version[0]},{version[1]},{version[2]},{version[4]} - PRODUCTVERSION {version[0]},{version[1]},{version[2]},{version[4]} - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK - FILEFLAGS {file_flags} - FILEOS VOS__WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE VFT2_UNKNOWN - - BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "OpenSlides team\\0" - VALUE "FileDescription", "OpenSlides\\0" - VALUE "FileVersion", "{version_str}\\0" - VALUE "InternalName", "OpenSlides\\0" - VALUE "LegalCopyright", "Copyright \\251 2011-2015\\0" - VALUE "OriginalFilename", "openslides.exe\\0" - VALUE "ProductName", "OpenSlides\\0" - VALUE "ProductVersion", "{version_str}\\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 0x4E4 - END - END -""" - - -def compile_re_list(patterns): - expr = "|".join("(?:{0})".format(x) for x in patterns) - return re.compile(expr) - - -def relpath(base, path, addslash=False): - b = os.path.normpath(os.path.abspath(base)) - p = os.path.normpath(os.path.abspath(path)) - if p == b: - p = "." - if addslash: - p += "/" - return p - - b += os.sep - if not p.startswith(b): - raise ValueError("{0!r} is not relative to {1!r}".format(path, base)) - p = p[len(b):].replace(os.sep, "/") - if addslash: - p += "/" - - return p - - -def filter_excluded_dirs(exclude_pattern, basedir, dirpath, dnames): - i, l = 0, len(dnames) - while i < l: - rp = relpath(basedir, os.path.join(dirpath, dnames[i]), True) - if exclude_pattern.search(rp): - del dnames[i] - l -= 1 - else: - i += 1 - - -def copy_dir_exclude(exclude, basedir, srcdir, destdir): - for dp, dnames, fnames in os.walk(srcdir): - filter_excluded_dirs(exclude, basedir, dp, dnames) - - rp = relpath(basedir, dp) - target_dir = os.path.join(destdir, rp) - if not os.path.exists(target_dir): - os.makedirs(target_dir) - - for fn in fnames: - fp = os.path.join(dp, fn) - rp = relpath(basedir, fp) - if exclude.search(rp): - continue - - shutil.copyfile(fp, os.path.join(destdir, rp)) - - -def collect_lib(libdir, odir): - exclude = compile_re_list(COMMON_EXCLUDE + LIBEXCLUDE) - copy_dir_exclude(exclude, libdir, libdir, os.path.join(odir, "Lib")) - - -def get_pkg_exclude(name, extra=()): - exclude = COMMON_EXCLUDE[:] - exclude.extend(SITE_PACKAGES.get(name, {}).get("exclude", [])) - exclude.extend(extra) - return compile_re_list(exclude) - - -def copy_package(name, info, odir): - copy_things = info.get("copy", []) - if not copy_things: - return - - dist = pkg_resources.get_distribution(name) - exclude = get_pkg_exclude(name) - - site_dir = dist.location - for thing in copy_things: - fp = os.path.join(site_dir, thing) - if not os.path.isdir(fp): - rp = relpath(site_dir, fp) - ofp = os.path.join(odir, rp) - shutil.copyfile(fp, ofp) - else: - copy_dir_exclude(exclude, site_dir, fp, odir) - - -def copy_wx(odir): - base_dir = os.path.dirname(os.path.dirname(wx.__file__)) - wx_dir = os.path.join(base_dir, "wx") - exclude = get_pkg_exclude("wx") - copy_dir_exclude(exclude, base_dir, wx_dir, odir) - - -def collect_site_packages(sitedir, odir): - if not os.path.exists(odir): - os.makedirs(odir) - - for name, info in SITE_PACKAGES.iteritems(): - copy_package(name, info, odir) - - assert "wx" in SITE_PACKAGES - copy_wx(odir) - - -def compile_openslides_launcher(): - try: - cc = distutils.ccompiler.new_compiler() - if not cc.initialized: - cc.initialize() - except distutils.errors.DistutilsError: - return False - - cc.add_include_dir(distutils.sysconfig.get_python_inc()) - cc.define_macro("_CRT_SECURE_NO_WARNINGS") - - gui_data_dir = os.path.dirname(openslides_gui.__file__) - gui_data_dir = os.path.join(gui_data_dir, "data") - shutil.copyfile( - os.path.join(gui_data_dir, "openslides.ico"), - "extras/win32-portable/openslides.ico") - rcfile = "extras/win32-portable/openslides.rc" - with open(rcfile, "w") as f: - if openslides.VERSION[3] == "final": - file_flags = "0" - else: - file_flags = "VS_FF_PRERELEASE" - - f.write(OPENSLIDES_RC_TMPL.format( - version=openslides.VERSION, - version_str=openslides.get_version(), - file_flags=file_flags)) - - objs = cc.compile([ - "extras/win32-portable/openslides.c", - rcfile, - ]) - cc.link_executable( - objs, "extras/win32-portable/openslides", - extra_preargs=["/subsystem:windows", "/nodefaultlib:python27.lib"], - libraries=["user32"] - ) - return True - - -def openslides_launcher_update_version_resource(): - try: - import win32api - import win32verstamp - except ImportError: - sys.stderr.write( - "Using precompiled executable and pywin32 is not available - " - "version resource may be out of date!\n") - return False - import struct - - sys.stdout.write("Updating version resource") - # code based on win32verstamp.stamp() with some minor differences in - # version handling - major, minor, sub = openslides.VERSION[:3] - build = openslides.VERSION[4] - pre_release = openslides.VERSION[3] != "final" - version_str = openslides.get_version() - - sdata = { - "CompanyName": "OpenSlides team", - "FileDescription": "OpenSlides", - "FileVersion": version_str, - "InternalName": "OpenSlides", - "LegalCopyright": u"Copyright \xa9 2011-2015", - "OriginalFilename": "openslides.exe", - "ProductName": "OpenSlides", - "ProductVersion": version_str, - } - vdata = { - "Translation": struct.pack("hh", 0x409, 0x4e4), - } - - vs = win32verstamp.VS_VERSION_INFO( - major, minor, sub, build, sdata, vdata, pre_release, False) - h = win32api.BeginUpdateResource("extras/win32-portable/openslides.exe", 0) - win32api.UpdateResource(h, 16, 1, vs) - win32api.EndUpdateResource(h, 0) - - -def copy_dlls(odir): - dll_src = os.path.join(sys.exec_prefix, "DLLs") - dll_dest = os.path.join(odir, "DLLs") - if not os.path.exists(dll_dest): - os.makedirs(dll_dest) - - for dll_name in PY_DLLS: - src = os.path.join(dll_src, dll_name) - dest = os.path.join(dll_dest, dll_name) - shutil.copyfile(src, dest) - - pydllname = "python{0}{1}.dll".format(*sys.version_info[:2]) - src = os.path.join(os.environ["WINDIR"], "System32", pydllname) - dest = os.path.join(dll_dest, pydllname) - shutil.copyfile(src, dest) - - -def copy_msvcr(odir): - candidates = glob.glob("{0}/x86_*{1}_{2}*".format( - os.path.join(os.environ["WINDIR"], "winsxs"), - MSVCR_NAME, MSVCR_PUBLIC_KEY)) - - msvcr_local_name = None - msvcr_dll_dir = None - for dp in candidates: - bn = os.path.basename(dp) - if MSVCR_VERSION in bn: - msvcr_local_name = bn - msvcr_dll_dir = dp - break - else: - sys.stderr.write( - "Warning could not determine msvcr runtime location\n" - "Private asssembly for VC runtime must be added manually\n") - return - - msvcr_dest_dir = os.path.join(odir, MSVCR_NAME) - if not os.path.exists(msvcr_dest_dir): - os.makedirs(msvcr_dest_dir) - - for fn in os.listdir(msvcr_dll_dir): - src = os.path.join(msvcr_dll_dir, fn) - dest = os.path.join(msvcr_dest_dir, fn) - shutil.copyfile(src, dest) - - src = os.path.join( - os.environ["WINDIR"], "winsxs", "Manifests", - "{0}.manifest".format(msvcr_local_name)) - dest = os.path.join(msvcr_dest_dir, "{0}.manifest".format(MSVCR_NAME)) - shutil.copyfile(src, dest) - - -def write_package_info_content(outfile): - """ - Writes a list of all included packages into outfile. - """ - text = ['Included Packages\n', 17 * '=' + '\n', '\n'] - for pkg in sorted(SITE_PACKAGES): - if pkg == "wx": - # wxpython comes from an installer and has no distribution - # --> handle it separately - text.append("wxpython-{0}\n".format(wx.__version__)) - else: - dist = pkg_resources.get_distribution(pkg) - text.append("{0}-{1}\n".format(dist.project_name, dist.version)) - with open(outfile, "w") as f: - f.writelines(text) - - -def write_metadatafile(infile, outfile): - """ - Writes content from metadata files like README, AUTHORS and LICENSE into - outfile. - """ - with open(infile, "rU") as f: - text = [l for l in f] - with open(outfile, "w") as f: - f.writelines(text) - - -def main(): - prefix = os.path.dirname(sys.executable) - libdir = os.path.join(prefix, "Lib") - sitedir = os.path.join(libdir, "site-packages") - odir = "dist/openslides-{0}-portable".format(openslides.get_version()) - - try: - shutil.rmtree(odir) - except OSError as e: - if e.errno != errno.ENOENT: - raise - - os.makedirs(odir) - out_site_packages = os.path.join(odir, "Lib", "site-packages") - - collect_lib(libdir, odir) - collect_site_packages(sitedir, out_site_packages) - - exclude = get_pkg_exclude("openslides") - copy_dir_exclude(exclude, ".", "openslides", out_site_packages) - - if not compile_openslides_launcher(): - sys.stdout.write("Using prebuild openslides.exe\n") - openslides_launcher_update_version_resource() - - shutil.copyfile( - "extras/win32-portable/openslides.exe", - os.path.join(odir, "openslides.exe")) - - shutil.copytree( - "extras/openslides_gui", - os.path.join(out_site_packages, "openslides_gui")) - - copy_dlls(odir) - copy_msvcr(odir) - - # Info on included packages - shutil.copytree( - "extras/win32-portable/licenses", - os.path.join(odir, "packages-info")) - write_package_info_content(os.path.join(odir, 'packages-info', 'PACKAGES.txt')) - - # Create plugins directory with README.txt - plugindir = os.path.join(odir, "openslides", "plugins") - os.makedirs(plugindir) - readmetext = ["Please copy your plugin directory into this directory.\n", "\n", - "For more information about OpenSlides plugins see:\n", - "https://github.com/OpenSlides/OpenSlides/wiki/De%3APlugins\n"] - with open(os.path.join(plugindir, 'README.txt'), "w") as readme: - readme.writelines(readmetext) - - # AUTHORS, LICENSE, README - write_metadatafile('AUTHORS', os.path.join(odir, 'AUTHORS.txt')) - write_metadatafile('LICENSE', os.path.join(odir, 'LICENSE.txt')) - write_metadatafile('README.rst', os.path.join(odir, 'README.txt')) - - zip_fp = os.path.join( - "dist", "openslides-{0}-portable.zip".format( - openslides.get_version())) - - - with zipfile.ZipFile(zip_fp, "w", zipfile.ZIP_DEFLATED) as zf: - for dp, dnames, fnames in os.walk(odir): - for fn in fnames: - fp = os.path.join(dp, fn) - rp = relpath(odir, fp) - zf.write(fp, rp) - - print("Successfully build {0}".format(zip_fp)) - - -if __name__ == "__main__": - main()