Cannot initialise Seahub

1,068 views
Skip to first unread message

Alfredo

unread,
Nov 22, 2013, 8:43:36 AM11/22/13
to sea...@googlegroups.com
Hi there,

I built seafile server, ccnet, seahub, etc. from source. Now I'm trying to configure everything manually.

So far I have successfully configured ccnet-server and seaf-server. But I get an error when attempting co configure Seahub.

This is the error that I get:

$ python manage.py syncdb
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 261, in fetch_command
    commands = get_commands()
  File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 107, in get_commands
    apps = settings.INSTALLED_APPS
  File "/usr/lib/python2.7/site-packages/django/conf/__init__.py", line 54, in __getattr__
    self._setup(name)
  File "/usr/lib/python2.7/site-packages/django/conf/__init__.py", line 49, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/lib/python2.7/site-packages/django/conf/__init__.py", line 132, in __init__
    % (self.SETTINGS_MODULE, e)
ImportError: Could not import settings 'seahub.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named seaserv


Can you advise on how to solve this error? I have been following this guide:
https://github.com/haiwen/seafile/wiki/Create-server-configuration-by-hand

Thanks in advance

Alfredo

unread,
Nov 22, 2013, 9:03:04 AM11/22/13
to sea...@googlegroups.com
Also, it would be greatly appreciated if you could finish this part of the guide:

Create a seahub admin account

XXX: write how to create a seahub admin


Alfredo

unread,
Nov 22, 2013, 10:03:32 AM11/22/13
to sea...@googlegroups.com
I added /usr/local/lib/python2.7/site-packages to the PYTHONPATH, so I'm now using:

export PYTHONPATH=/data/haiwen/seafile-server/seahub/thirdpart:/usr/local/lib/python2.7/site-packages

and that solved the error from my first post.

HOWEVER, the script crashed at another error:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 280, in execute
    translation.activate('en-us')
  File "/usr/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 130, in activate
    return _trans.activate(language)
  File "/usr/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 188, in activate
    _active.value = translation(language)
  File "/usr/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 177, in translation
    default_translation = _fetch(settings.LANGUAGE_CODE)
  File "/usr/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 159, in _fetch
    app = import_module(appname)
  File "/usr/lib/python2.7/site-packages/django/utils/importlib.py", line 40, in import_module
    __import__(name)
  File "/data/haiwen/seafile-server/seahub/seahub/wiki/__init__.py", line 3, in <module>
    from utils import get_personal_wiki_page, get_personal_wiki_repo, \
  File "/data/haiwen/seafile-server/seahub/seahub/wiki/utils.py", line 13, in <module>
    from seahub.utils import EMPTY_SHA1
  File "/data/haiwen/seafile-server/seahub/seahub/utils/__init__.py", line 1080, in <module>
    from seahub.base.models import FileContributors, DirFilesLastModifiedInfo, FileLastModifiedInfo
  File "/data/haiwen/seafile-server/seahub/seahub/base/models.py", line 14, in <module>
    from seahub.base.templatetags.seahub_tags import at_pattern
  File "/data/haiwen/seafile-server/seahub/seahub/base/templatetags/seahub_tags.py", line 15, in <module>
    from seahub.base.accounts import User
  File "/data/haiwen/seafile-server/seahub/seahub/base/accounts.py", line 9, in <module>
    from seahub.auth.models import get_hexdigest, check_password
  File "/data/haiwen/seafile-server/seahub/seahub/auth/models.py", line 47, in <module>
    class AnonymousUser(object):
  File "/data/haiwen/seafile-server/seahub/seahub/auth/models.py", line 53, in AnonymousUser
    _groups = EmptyManager()
TypeError: __init__() takes exactly 2 arguments (1 given)

Any ideas on how to solve this?

Alfredo

unread,
Nov 22, 2013, 11:31:23 AM11/22/13
to sea...@googlegroups.com
So, I went ahead and modified /data/haiwen/seafile-server/seahub/seahub/auth/models.py based on updated code from
/usr/lib/python2.7/site-packages/django/contrib/auth/models.py

After copying over some code, I was able to successfully run manage.py without errors. It looks like the errors were caused because the original seahub/auth/models.py file was written for an old version of django, whereas I have version 1.6, the latest in the ArchLinux repositories.

Anyway, the code that works is the following:

import datetime
import hashlib
import urllib

# import auth
from django.core.exceptions import ImproperlyConfigured
from django.db import models
from django.db.models.manager import EmptyManager
from django.contrib.contenttypes.models import ContentType
from django.utils.encoding import smart_str
from django.utils.translation import ugettext_lazy as _


UNUSABLE_PASSWORD = '!' # This will never be a valid hash

def get_hexdigest(algorithm, salt, raw_password):
    """
    Returns a string of the hexdigest of the given plaintext password and salt
    using the given algorithm ('md5', 'sha1' or 'crypt').
    """
    raw_password, salt = smart_str(raw_password), smart_str(salt)
    if algorithm == 'crypt':
        try:
            import crypt
        except ImportError:
            raise ValueError('"crypt" password algorithm not supported in this environment')
        return crypt.crypt(raw_password, salt)

    if algorithm == 'md5':
        return hashlib.md5(salt + raw_password).hexdigest()
    elif algorithm == 'sha1':
        return hashlib.sha1(salt + raw_password).hexdigest()
    raise ValueError("Got unknown password algorithm type in password.")

def check_password(raw_password, enc_password):
    """
    Returns a boolean of whether the raw_password was correct. Handles
    encryption formats behind the scenes.
    """
    algo, salt, hsh = enc_password.split('$')
    return hsh == get_hexdigest(algo, salt, raw_password)

class SiteProfileNotAvailable(Exception):
    pass


class GroupManager(models.Manager):
    """
    The manager for the auth's Group model.
    """
    def get_by_natural_key(self, name):
        return self.get(name=name)


class PermissionManager(models.Manager):
    def get_by_natural_key(self, codename, app_label, model):
        return self.get(
            codename=codename,
            content_type=ContentType.objects.get_by_natural_key(app_label,
                                                                model),
        )


class Permission(models.Model):
    """
    The permissions system provides a way to assign permissions to specific
    users and groups of users.

    The permission system is used by the Django admin site, but may also be
    useful in your own code. The Django admin site uses permissions as follows:

        - The "add" permission limits the user's ability to view the "add" form
          and add an object.
        - The "change" permission limits a user's ability to view the change
          list, view the "change" form and change an object.
        - The "delete" permission limits the ability to delete an object.

    Permissions are set globally per type of object, not per specific object
    instance. It is possible to say "Mary may change news stories," but it's
    not currently possible to say "Mary may change news stories, but only the
    ones she created herself" or "Mary may only change news stories that have a
    certain status or publication date."

    Three basic permissions -- add, change and delete -- are automatically
    created for each Django model.
    """
    name = models.CharField(_('name'), max_length=50)
    content_type = models.ForeignKey(ContentType)
    codename = models.CharField(_('codename'), max_length=100)
    objects = PermissionManager()

    class Meta:
        verbose_name = _('permission')
        verbose_name_plural = _('permissions')
        unique_together = (('content_type', 'codename'),)
        ordering = ('content_type__app_label', 'content_type__model',
                    'codename')

    def __str__(self):
        return "%s | %s | %s" % (
            six.text_type(self.content_type.app_label),
            six.text_type(self.content_type),
            six.text_type(self.name))

    def natural_key(self):
        return (self.codename,) + self.content_type.natural_key()
    natural_key.dependencies = ['contenttypes.contenttype']


class Group(models.Model):
    """
    Groups are a generic way of categorizing users to apply permissions, or
    some other label, to those users. A user can belong to any number of
    groups.

    A user in a group automatically has all the permissions granted to that
    group. For example, if the group Site editors has the permission
    can_edit_home_page, any user in that group will have that permission.

    Beyond permissions, groups are a convenient way to categorize users to
    apply some label, or extended functionality, to them. For example, you
    could create a group 'Special users', and you could write code that would
    do special things to those users -- such as giving them access to a
    members-only portion of your site, or sending them members-only email
    messages.
    """
    name = models.CharField(_('name'), max_length=80, unique=True)
    permissions = models.ManyToManyField(Permission,
        verbose_name=_('permissions'), blank=True)

    objects = GroupManager()

    class Meta:
        verbose_name = _('group')
        verbose_name_plural = _('groups')

    def __str__(self):
        return self.name

    def natural_key(self):
        return (self.name,)   


class AnonymousUser(object):
    id = None
    username = ''
    is_staff = False
    is_active = False
    is_superuser = False
    _groups = EmptyManager(Group)
    _user_permissions = EmptyManager(Permission)

    def __init__(self):
        pass

    def __unicode__(self):
        return 'AnonymousUser'

    def __str__(self):
        return unicode(self).encode('utf-8')

    def __eq__(self, other):
        return isinstance(other, self.__class__)

    def __ne__(self, other):
        return not self.__eq__(other)

    def __hash__(self):
        return 1 # instances always return the same hash value

    def save(self):
        raise NotImplementedError

    def delete(self):
        raise NotImplementedError

    def set_password(self, raw_password):
        raise NotImplementedError

    def check_password(self, raw_password):
        raise NotImplementedError

    def _get_groups(self):
        return self._groups
    groups = property(_get_groups)

    def _get_user_permissions(self):
        return self._user_permissions
    user_permissions = property(_get_user_permissions)

    def get_group_permissions(self, obj=None):
        return set()

    def get_all_permissions(self, obj=None):
        return _user_get_all_permissions(self, obj=obj)

    def has_perm(self, perm, obj=None):
        return _user_has_perm(self, perm, obj=obj)

    def has_perms(self, perm_list, obj=None):
        for perm in perm_list:
            if not self.has_perm(perm, obj):
                return False
        return True

    def has_module_perms(self, module):
        return _user_has_module_perms(self, module)

    def get_and_delete_messages(self):
        return []

    def is_anonymous(self):
        return True

    def is_authenticated(self):
        return False

Just a disclaimer: I'm *NOT* a Python developer. I just have a very basic knowledge of the language. I had never encountered django in my life until today. So, there might be some errors or inefficiencies in this code. But at least, it works!

ZhengXie

unread,
Nov 26, 2013, 10:27:22 PM11/26/13
to sea...@googlegroups.com
Thanks for your work, we will test Django 1.6 in the near future.

--
You received this message because you are subscribed to the Google Groups "seafile" group.
To unsubscribe from this group and stop receiving emails from it, send an email to seafile+u...@googlegroups.com.
To post to this group, send email to sea...@googlegroups.com.
Visit this group at http://groups.google.com/group/seafile.
For more options, visit https://groups.google.com/groups/opt_out.

Alfredo

unread,
Nov 27, 2013, 9:20:08 AM11/27/13
to sea...@googlegroups.com
That will be great, because in the Ubuntu repositories and the Arch Linux repositories only Django 1.6 is available at the moment. I suppose you *could* install Django 1.5 manually, but that can be difficult if you're not a Python developer.

Another thing that I did was to change all occurrences of this:
from django.conf.urls.defaults import ...
to this:
from django.conf.urls import ...
I did this in all files. At the moment, Seahub is successfully running on my machine using Django 1.6.

Cheers,
Alfredo
Reply all
Reply to author
Forward
0 new messages