Giter VIP home page Giter VIP logo

xadmin-server's Issues

页面迁移没有生效

把消息中心的页面复制到一个新的路由页面之后 消息中心页面并没有正常显示,请问是有什么检验规则(尝试迁移其他页面也一样)

权限访问问题

1.我创建了一个普通用户 仅查看权限 以及管理员 可操作全部数据 但是我发现在查看测试数据时无法正常显示已新增数据, 观察后台日志发现他会默认在查询时传参id=000000 如下

SELECT COUNT(*) AS __count FROM XXXXXXX WHERE (XXXXXXX.id = '00000000000000000000000000000000' OR XXXXXXX.id = '00000000000000000000000000000000'); args=('00000000000000000000000000000000', '00000000000000000000000000000000'); alias=default

在common/core的filter.py文件中 的 permission = DataPermission.objects.filter(is_active=True).filter(deptinfo=p_dept_obj).filter(dq)这一步出现的上面查询条件

但是当我使用超级用户访问页面的时候 数据就会正常显示了
1
2
3
4
5
6

  1. 菜单管理--新增--权限中的权限路由有些问题 在我新创建一个模块用于开发 例如A模块 下面的 a,b,c三个接口 访问路径为A/a A/b A/c 此时的权限路由有时会没有a,b,c的选项 需重复启动多次
    另外 当可以选择以后 它显示的是没有A这个开头的 也就是直接是a/ b/ c/ 这样在common/core的permission文件中的if p_data.get('method') == request.method and re.match(f"/{p_data.get('path')}", url):这一步 会对比失败 从而导致显示权限不足的错误 现在解决办法是手动去表中修改他的权限路由 将他改为A/a就可以正常访问了

celery 定时任务启动后前台无法加载对应的页面

使用如下服务启动后:
python manage.py runserver 0.0.0.0:8896
python -m celery -A server flower -logging=info --url_prefix=/api/flower --auto_refresh=False --address=127.0.0.1 --port=5566
python -m celery -A server beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler --max-interval 60
python -m celery -A server worker -P prefork -l INFO --autoscale 10,3 -Q celery --heartbeat-interval 10 -n celery@%h --without-mingle

无法在前端页面通过:http://127.0.0.1:5566/api/flower

麻烦抽空提供一个详细的指导呢?感谢作者

创建管理员报错

`(.venv) dengwang@dengwangs-MacBook-Pro xadmin-server % python manage.py createsuperuser
System check identified some issues:

WARNINGS:
system.DataPermission.menu: (fields.W340) null has no effect on ManyToManyField.
system.DeptInfo.roles: (fields.W340) null has no effect on ManyToManyField.
system.DeptInfo.rules: (fields.W340) null has no effect on ManyToManyField.
system.FieldPermission.field: (fields.W340) null has no effect on ManyToManyField.
system.Menu.model: (fields.W340) null has no effect on ManyToManyField.
system.NoticeMessage.notice_dept: (fields.W340) null has no effect on ManyToManyField.
system.NoticeMessage.notice_role: (fields.W340) null has no effect on ManyToManyField.
system.NoticeMessage.notice_user: (fields.W340) null has no effect on ManyToManyField.
system.UserInfo.roles: (fields.W340) null has no effect on ManyToManyField.
system.UserInfo.rules: (fields.W340) null has no effect on ManyToManyField.
system.UserRole.menu: (fields.W340) null has no effect on ManyToManyField.
Username: adminn
Email address: [email protected]
Password:
Password (again):
Traceback (most recent call last):
File "/Users/dengwang/Code/Python/gene/xadmin-server/manage.py", line 22, in
main()
File "/Users/dengwang/Code/Python/gene/xadmin-server/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/init.py", line 442, in execute_from_command_line
utility.execute()
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/init.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/base.py", line 413, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 89, in execute
return super().execute(*args, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/base.py", line 459, in execute
output = self.handle(*args, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 238, in handle
self.UserModel._default_manager.db_manager(database).create_superuser(
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/contrib/auth/models.py", line 172, in create_superuser
return self._create_user(username, email, password, **extra_fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/contrib/auth/models.py", line 155, in _create_user
user.save(using=self.db)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/contrib/auth/base_user.py", line 78, in save
super().save(*args, **kwargs)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 822, in save
self.save_base(
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 924, in save_base
post_save.send(
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 189, in send
response = receiver(signal=self, sender=sender, **named)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/system/utils/signal_handler.py", line 171, in clean_cache_handler
invalid_user_cache(instance.pk)
File "/Users/dengwang/Code/Python/gene/xadmin-server/system/utils/signal_handler.py", line 110, in invalid_user_cache
cache_response.invalid_cache(f'UserInfoView_retrieve
{user_pk}')
File "/Users/dengwang/Code/Python/gene/xadmin-server/common/base/magic.py", line 215, in invalid_cache
for delete_key in cache.iter_keys(cache_key):
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django_redis/client/default.py", line 688, in iter_keys
for item in client.scan_iter(match=pattern, count=itersize):
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/commands/core.py", line 3051, in scan_iter
cursor, data = self.scan(
^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/commands/core.py", line 3026, in scan
return self.execute_command("SCAN", *pieces, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/client.py", line 540, in execute_command
conn = self.connection or pool.get_connection(command_name, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/connection.py", line 1104, in get_connection
connection.connect()
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/connection.py", line 288, in connect
self.on_connect()
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/connection.py", line 354, in on_connect
auth_response = self.read_response()
^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/connection.py", line 512, in read_response
response = self._parser.read_response(disable_decoding=disable_decoding)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/_parsers/resp2.py", line 15, in read_response
result = self._read_response(disable_decoding=disable_decoding)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/_parsers/resp2.py", line 25, in _read_response
raw = self._buffer.readline()
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/_parsers/socket.py", line 115, in readline
self._read_from_socket()
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/_parsers/socket.py", line 68, in _read_from_socket
raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
redis.exceptions.ConnectionError: Connection closed by server.
(.venv) dengwang@dengwangs-MacBook-Pro xadmin-server %

`

bug反馈

1、部门管理中,归属部门为空的行,列表中状态开关切换报错;
parent = BasePrimaryKeyRelatedField(queryset=models.DeptInfo.objects, allow_null=True)
修改为
parent = BasePrimaryKeyRelatedField(queryset=models.DeptInfo.objects, allow_null=True, required=False)
后正常;

2、角色权限、数据权限,列表中状态开关切换报错;
暂不知道上述修改有啥影响,其他没看,感觉类似的功能似乎都可能存在问题。

建议

非常感谢大佬的开源,有关后端部分,希望大佬也出份文档说明一下

feat: 根据后端接口自动生成前端代码

如果后端的接口已经写好了。
感觉可以直接生成前端的代码,因为前端代码非常多都是类似的。
直接生成,这样就可以避免手动写很多重复的代码。
希望可以增加这个功能。
image

[Feature] 关于数据的可见范围、可编辑范围的控制需求

用户故事

数据归属有时候会归属于多个部门以及多人,甚至查看和编辑都是分属不同组和人员的

打个比方有一条数据,3个部门可以看到,其中2个部门可以编辑,除了部门外,另外3个人可以看到,其中俩个人可以编辑,如下:

a部门、b部门、c部门、张三、李四、王五可以看这条数据。
但是只有a部门、b部门、张三、李四可以修改这条数据。

我的理解是:
当前要实现上方需求,需要基于数据在数据权限中定义id_exact具体的值来选中具体数据, 然后找到对应的用户去设置此数据权限。

不知我理解的当前项目是否是这样运行的。

此处有两个疑问:

  1. 数据权限的数据量较大的时候,此设置会过于繁琐
  2. 数据权限的数据量大了之后,针对数据鉴权会不会过慢
class DbAuditModel(DbBaseModel):
    creator = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='creator_query', null=True, blank=True,
                                verbose_name='创建人', on_delete=models.SET_NULL, related_name='+')
    modifier = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='modifier_query', null=True,
                                 blank=True, verbose_name='修改人', on_delete=models.SET_NULL, related_name='+')
    dept_belong = models.ForeignKey(to="system.DeptInfo", related_query_name='dept_belong_query', null=True, blank=True,
                                    verbose_name='数据归属部门', on_delete=models.SET_NULL, related_name='+')

    class Meta:
        abstract = True

建议新增几个字段

  1. 数据的可见部门:ManyToMany类型,用于控制哪些部门可以看到这些数据。
  2. 数据的可见人员:ManyToMany类型,用于控制哪些人员可以看到这些数据。
  3. 数据的可编辑部门:ManyToMany类型,用于控制哪些部门可以编辑这些数据。
  4. 数据的可编辑人员:ManyToMany类型,用于控制哪些人员可以看到这些数据。

然后在数据新增的时候,都添加一个选择对应可见人员、可编辑人员的选项(默认值为当前用户,以及当前用户所属的所有部门,用户可以点选修改),如下图,只列出了可见范围设置:
image

这样就可以通过对这4个字段来校验用户是否具有查看、编辑权限
判定逻辑:

  1. 判断当前用户是否在可见、可编辑人员列表里,分别返回是否可见、可编辑
  2. 判断当前用户的所属部门列表是否与可见、可编辑部门的列表有交集,分别返回是否可见、可编辑

或者是否是我理解项目有问题,目前可以通过其他配置解决此问题?

望回复~

验证码 加载失败

image
请问为什么我的验证码加载失败,这跟cerely和flower有关吗,我的前后端都运行起来了,只是后端没运行cerely和flower

接口加载耗时

接口加载耗时,目前在本地跑的结果,感觉登录和页面访问加载比较慢?这个是因为后台数据权限校验导致的吗?

目前系统的权限校验是否有文档呢?

[Feature] 希望能添加为用户设置多个部门以及为部门设置负责人的需求

功能名称

为用户设置多个部门以及为部门设置负责人的功能

功能描述

希望能够新增为用户设置多个部门以及为部门设置负责人的需求的功能

用户故事

真实情况中,人员可能隶属于多个部门。

如下图,企业微信可以为人员设置多个部门,并可以选其中一个部门为主部门

image

部门中也可以设置多个人为本部门负责人,如下图:

image

新增这个功能后,可以用于做审批流的特定场景下使用,获取对应部门下的负责人进行审批。

望采纳~~

导入菜单报错

(.venv) dengwang@dengwangs-MacBook-Pro xadmin-server % python manage.py load_init_json
System check identified some issues:

WARNINGS:
system.DataPermission.menu: (fields.W340) null has no effect on ManyToManyField.
system.DeptInfo.roles: (fields.W340) null has no effect on ManyToManyField.
system.DeptInfo.rules: (fields.W340) null has no effect on ManyToManyField.
system.FieldPermission.field: (fields.W340) null has no effect on ManyToManyField.
system.Menu.model: (fields.W340) null has no effect on ManyToManyField.
system.NoticeMessage.notice_dept: (fields.W340) null has no effect on ManyToManyField.
system.NoticeMessage.notice_role: (fields.W340) null has no effect on ManyToManyField.
system.NoticeMessage.notice_user: (fields.W340) null has no effect on ManyToManyField.
system.UserInfo.roles: (fields.W340) null has no effect on ManyToManyField.
system.UserInfo.rules: (fields.W340) null has no effect on ManyToManyField.
system.UserRole.menu: (fields.W340) null has no effect on ManyToManyField.
Traceback (most recent call last):
File "/Users/dengwang/Code/Python/gene/xadmin-server/manage.py", line 22, in
main()
File "/Users/dengwang/Code/Python/gene/xadmin-server/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/init.py", line 442, in execute_from_command_line
utility.execute()
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/init.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/base.py", line 413, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/base.py", line 459, in execute
output = self.handle(*args, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/system/management/commands/load_init_json.py", line 34, in handle
super(Command, self).handle(fixture_labels, **options)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/commands/loaddata.py", line 102, in handle
self.loaddata(fixture_labels)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/commands/loaddata.py", line 163, in loaddata
self.load_label(fixture_label)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/commands/loaddata.py", line 253, in load_label
if self.save_obj(obj):
^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/management/commands/loaddata.py", line 209, in save_obj
obj.save(using=self.using)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/core/serializers/base.py", line 265, in save
models.Model.save_base(self.object, using=using, raw=True, **kwargs)
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/db/models/base.py", line 924, in save_base
post_save.send(
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 189, in send
response = receiver(signal=self, sender=sender, **named)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/system/utils/signal_handler.py", line 134, in clean_cache_handler
cache_response.invalid_cache('MenuView_list_
')
File "/Users/dengwang/Code/Python/gene/xadmin-server/common/base/magic.py", line 215, in invalid_cache
for delete_key in cache.iter_keys(cache_key):
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/django_redis/client/default.py", line 688, in iter_keys
for item in client.scan_iter(match=pattern, count=itersize):
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/commands/core.py", line 3051, in scan_iter
cursor, data = self.scan(
^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/commands/core.py", line 3026, in scan
return self.execute_command("SCAN", *pieces, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/client.py", line 540, in execute_command
conn = self.connection or pool.get_connection(command_name, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/connection.py", line 1104, in get_connection
connection.connect()
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/connection.py", line 288, in connect
self.on_connect()
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/connection.py", line 354, in on_connect
auth_response = self.read_response()
^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/connection.py", line 512, in read_response
response = self._parser.read_response(disable_decoding=disable_decoding)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/_parsers/resp2.py", line 15, in read_response
result = self._read_response(disable_decoding=disable_decoding)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/_parsers/resp2.py", line 25, in _read_response
raw = self._buffer.readline()
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/_parsers/socket.py", line 115, in readline
self._read_from_socket()
File "/Users/dengwang/Code/Python/gene/xadmin-server/.venv/lib/python3.11/site-packages/redis/_parsers/socket.py", line 68, in _read_from_socket
raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
redis.exceptions.ConnectionError: Problem installing fixture '/Users/dengwang/Code/Python/gene/xadmin-server/loadjson/menu.json': Connection closed by server.
(.venv) dengwang@dengwangs-MacBook-Pro xadmin-server %

is:issue is:open 菜单管理里的权限路由如何新增

Snipaste_2024-03-14_17-23-52

我大概阅读了前后端代码 貌似只有从数据库内读取部分数据 新增路由权限选项是直接在数据库内操作吗?
即使直接在数据库中的path字段添加了权限路由 但在页面的下拉框内还是找不到对应的选项

登录问题

我部署后登录不进去。用python manage.py createsuperuser后
Uploading ac71032a555a13cb1814bdfa2538a49.png…

demo权限设置问题

你好,我在按照demo教程创建了图书管理页面后,新建了一个普通用户,并给它设置了角色和数据权限,但是查询图书列表返回的结果是空的,没整明白怎么配置的。但是用初始的管理员账号查询是没有问题的。
image
image
image
image

后台启动报错

File "", line 1050, in _gcd_import
File "", line 1027, in _find_and_load
File "", line 1006, in _find_and_load_unlocked
File "", line 688, in _load_unlocked
File "", line 883, in exec_module
File "", line 241, in call_with_frames_removed
File "E:\GitHub\xadmin-github\xadmin-server\common\management\commands\start.py", line 1, in
from .services.command import BaseActionCommand, Action
File "E:\GitHub\xadmin-github\xadmin-server\common\management\commands\services\command.py", line 7, in
from .utils import ServicesUtil
File "E:\GitHub\xadmin-github\xadmin-server\common\management\commands\services\utils.py", line 4, in
import daemon
File "E:\GitHub\xadmin-github\xadmin-server\venv\lib\site-packages\daemon_init
.py", line 33, in
from .daemon import DaemonContext
File "E:\GitHub\xadmin-github\xadmin-server\venv\lib\site-packages\daemon\daemon.py", line 13, in
import pwd
ModuleNotFoundError: No module named 'pwd'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.